GNU/Linux >> Linux の 問題 >  >> FreeBSD

Freebsd – Bsd Sed:パターンのN番目のオカレンスのみを置き換えますか?

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番目が互いに離れている場合、巨大なファイルで問題が発生します。


FreeBSD
  1. Sedを使用してパターン範囲間の行を検索および置換

  2. ファイル内の文字列を置き換える方法は?

  3. カスタム正規表現区切り文字を使用してパターンを含む行番号を見つけますか?

  1. パターンに一致する連続する行のすべてのシーケンスの最初の行だけを保持しますか?

  2. パターンの最後の出現を見つけて、最後の出現に続くすべての行を印刷する方法は?

  3. sedにおける「ホールド空間」と「パターン空間」の概念

  1. スマートクォートをLinuxsedコマンドに置き換えます

  2. テキスト ファイルの各行で n 番目に出現する文字列を置き換えます

  3. 複数行の Sed 置換