2015-04-08 79 views

回答

2

我會說:

sed -e '/text0/ { N; N; a text4' -e '}' filename 

即:

/text0/ { # when finding a line that matches text0 
    N  # fetch two more lines 
    N 
      # and only then append text4 
    a text4 
} 

將此作爲單行使用時,需要將其拆分爲兩個-e選項,以便a命令不會嘗試追加一行text4 }

或者,你可以使用

sed '/text0/ { N; N; s/$/\ntext4/; }' filename 

這避免使用笨重有些命令a但需要你逃跑的替換文本(如\&)一些元字符。

+0

最後的'-e'是什麼? –

+1

正如文中所述,終止'a'命令。字符串中的換行符也可以工作,並且bash字符串'$'/ text0/{N; N;一個text4 \ n}'。 ''''命令不會被'}'終止,也不會被'''終止,所以我們必須使用其他方式來終止它。 – Wintermute

+0

抱歉應該閱讀,只注意到它不在desciption代碼位,我的不好:) –

1

Perl的解決方案:

perl -pe 'push @append, 3 + $. if /text0/; 
      shift @append, print "text4\n" if $append[0] == $.; 
     ' input.txt > output.txt 

如果字符串輸入結束後要追加你可能需要一些更多的調整。

說明:

  • $.是行號。
  • /text0/匹配時,追加應該發生的行號被壓入數組@append。
  • 噹噹前行號對應於數組開頭的行號時,將打印該行並放棄該數組的第一個元素。

這也意味着它適用於重疊匹配和追加。

1

我會用awk此:

awk '/text0/ {f=NR} f && NR==f+2 {$0=$0RS"text4"}1' file 
text0 
text1 
text2 
text4 
text3 

模式時發現,設置f當前行號。
f爲真時,兩行後f && NR==f+2添加新文本$0=$0RS"text4"
1打印結果