sed - 在匹配后的X行后插入行

时间:2015-05-07 11:26:24

标签: linux shell sed

我有以下内容:

void function_1()
{
    //something (taking only 1 line)
}
->INSERT LINE HERE<-
//more code

使用sed,我想在INSERT LINE HERE标签处插入行。 最简单的方法应该是:

  1. 查找文字&#34; function_1&#34;
  2. 跳过3行
  3. 插入新行
  4. 但是没有一种已知的sed选项可以胜任这项工作。

    sed '/function_1/,3a new_text
    

    在&#39; function_1&#39;

    之后插入new_text
    sed '/function_1/,+3a new_text
    

    在接下来的3行之后插入new_text,&#39; function_1&#39;

    sed '/function_1/N;N;N; a new_text
    

    在多个地方插入new_text,与模式无关

    感谢。

4 个答案:

答案 0 :(得分:7)

试试这个:

sed "/function_1/{N;N;N;a new_text
}" filename

答案 1 :(得分:2)

sed '/function_1(/,/^[[:space:]]*}/ {
 ,/^[[:space:]]*}/ a\
Line that\
you want to\
insert (append) here
   }' YourFile
  • }
  • 开头的部分之后插入function_1(之后的行(单独在最后一行空格的行中)
  • 我假设您的内部代码中没有},例如您的样本

基于函数名称选择是可靠的,因为它可以在其他代码段中作为函数本身的调用使用(并且通常是它),所以可能/^void function_1()$/更好

答案 2 :(得分:1)

使用awk:

awk '1;/function_1/{c=4}c&&!--c{print "new text"}' file
  • 1{print}的简写,因此文件中的所有行都会打印
  • 匹配模式时,将c设置为4
  • c达到1(因此c为真且!--c为真)时,插入行

您可以使用!--c,但将c的检查添加为true也表示c不会继续减少超过0。

答案 3 :(得分:0)

不要数,匹配:

sed -e '/^void function_1()/,/^}$/ { /^}$/a\
TEXT TO INSERT
}' input

这将查看声明和右大括号之间的块,然后在右大括号后附加TEXT_TO_INSERT。