複数の置換式を使用しているときに、sed に 1 回だけ置換するように指示するにはどうすればよいですか?

複数の置換式を使用しているときに、sed に 1 回だけ置換するように指示するにはどうすればよいですか?

複数の置換ルールがありますが、最初の適用可能なルールのみを使用したいと思います。 はsed、デフォルトで、残りのルールを使用して出力の処理を続行します。 最初の置換後にブレークするにはどうすればよいですか? のみを使用して可能ですかsed? マニュアルでオプションを見つけることができませんでした。

実際の出力

$ sed "s/something/else/; s/one/two/; s/two/three/;" <<<"one"

three

希望する操作

$ sed "s/something/else/; s/one/two/; s/two/three/;" <<<"one"

two

答え1

t置換が行われた場合、各コマンドの後に コマンドを使用してsスクリプトの最後に分岐します。

sed -e 's/something/else/;t' \
    -e 's/one/two/;t' \
    -e 's/two/three/;t' <<<"one"

ここでは、最後の置換後のコマンドは必要ありませんが、このコードを自動生成する場合は、最後の置換も含めてt各 に接尾辞を付けても問題ありません。s

答え2

他のコマンドでブランチ 't' を使用した sed が完璧な答えです。

これは単なる提案です。置き換えた場合に内部で複数の操作を実行したい場合は、次のように使用できます。awk:

awk ' { if (gsub("something","else",$0) || gsub("one","two",$0) || gsub("two","three",$0) ){ print $0;exit}; }' <<<"one"

答え3

これらは順番に評価されるので、円がない場合でも簡単に評価できる場合は、

s/two/three/; s/one/two/; s/something/else/

円がある場合、またはリストが他のデータから生成された場合は、マーカーを使用できます。例:

s/@/@@/g
s/one/t@wo/
s/two/t@hree/
s/something/e@lse/
s/@\(.\)/\1/g

関連情報