2015-05-07 62 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。