BSDの使用sed
;
次の置換を実行するにはどうすればよいですか?:
前:
hello hello hello
hello hello hello
後:
hello world hello
hello hello hello
言い換えると; のみを置き換えるにはどうすればよいですか N th 発生 パターンの?
(またはこの場合; 2 nd 発生 パターンの?)
承認された回答:
任意のPOSIXsed
:
$ sed -e'/hello/{' -e:1 -e'$!N;s/hello/world/2;t2' -eb1 -e\} -e:2 -en\;b2 <file
hello world hello
hello hello hello
-
最初の一致後
/hello/
、ループが発生します。 -
ループ内
:1
、各N
を読み取りますs
を実行して、パターンスペースへのext行2
の代替コマンド nd回のみ。t
置換が成功したかどうかを推定します。はいの場合、ループ:2
に遭遇します 、それ以外の場合は、b1
でループを繰り返します 。 -
ループ内
:2
、ファイルの終わりまで残りの行を印刷するだけです。
このアプローチでは、2つの helloの間のすべてのものが保存されることに注意してください パターン空間で。最初と2番目が互いに離れている場合、巨大なファイルで問題が発生します。