如何讓sed在找到匹配後追加一些文本兩行?SED追加在下一個第n行,不追加到下一行
例如:
text0
text1
text2
text3
我匹配text0
後,我想在接下來的2行後追加text4
,那就是:
text0
text1
text2
text4
text3
如何讓sed在找到匹配後追加一些文本兩行?SED追加在下一個第n行,不追加到下一行
例如:
text0
text1
text2
text3
我匹配text0
後,我想在接下來的2行後追加text4
,那就是:
text0
text1
text2
text4
text3
我會說:
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
但需要你逃跑的替換文本(如\
和&
)一些元字符。
Perl的解決方案:
perl -pe 'push @append, 3 + $. if /text0/;
shift @append, print "text4\n" if $append[0] == $.;
' input.txt > output.txt
如果字符串輸入結束後要追加你可能需要一些更多的調整。
說明:
$.
是行號。/text0/
匹配時,追加應該發生的行號被壓入數組@append。這也意味着它適用於重疊匹配和追加。
我會用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
打印結果
最後的'-e'是什麼? –
正如文中所述,終止'a'命令。字符串中的換行符也可以工作,並且bash字符串'$'/ text0/{N; N;一個text4 \ n}'。 ''''命令不會被'}'終止,也不會被'''終止,所以我們必須使用其他方式來終止它。 – Wintermute
抱歉應該閱讀,只注意到它不在desciption代碼位,我的不好:) –