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