複数の代替式を使用する場合は、sedに一度だけ置き換えるように指示できますか?

複数の代替式を使用する場合は、sedに一度だけ置き換えるように指示できますか?

いくつかの代替ルールがありますが、最初の適用可能なルールのみを使用したいと思います。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 ' { 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

関連情報