2015-05-07 60 views
6

后,我有以下内容X线插入线:sed的 - 之后的比赛

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

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

  1. 查找文本 “function_1”
  2. 跳过3线
  3. 插入新行

但没有已知的SED选项做的工作。

sed '/function_1/,3a new_text 

插入 'function_1'

sed '/function_1/,+3a new_text 

插入NEW_TEXT之后的每个接下来的3行的,下面的 'function_1'

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

插入NEW_TEXT在多个位置,而不是相关的后右NEW_TEXT到图案

谢谢。

回答

4

试试这个:

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

或者:'sed'/ function_1 /!{p; d;}; n; n; n;一个新文本'它更加迂回,但在sed代码中没有换行符(因为'a'命令是最后)。 – Wintermute

+0

我想这种方法不适用于所有版本的sed,因为POSIX指定你应该使用'a \'后跟一个换行符来追加文本。 –

2
sed '/function_1(/,/^[[:space:]]*}/ { 
,/^[[:space:]]*}/ a\ 
Line that\ 
you want to\ 
insert (append) here 
    }' YourFile 
  • 从部分(前独自一人在符合最终一些空间)插入线}后开始function_1(
  • 我认为没有}单独在您的内部代码中,就像您的样本中

是基于功能名称选择carreful,因为它可以使用(normaly它是)在其他代码部分函数自身的调用,这样也许/^void function_1()$/更好

1

用AWK:

awk '1;/function_1/{c=4}c&&!--c{print "new text"}' file 
  • 1{print}的简写,所以文件中的所有行被打印
  • 当图案匹配时,设定c至4
  • c达到1(所以c是真实的,!--c是真实的),插入行

你可以只使用!--c,但增加在检查c是否真实,以及意味着c没有继续下降超过0。

0

不要指望,匹配:

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

这看起来在声明和右括号之间的块,然后闭括号后追加TEXT_TO_INSERT。