sedで特定のパターンを他のパターンよりも「優先順位」として指定する方法は?

sedで特定のパターンを他のパターンよりも「優先順位」として指定する方法は?

このsedフィルタがあります。

/.*[1-9][0-9][0-9] .*/{
        s/.*\([1-9][0-9][0-9] .*\)/\1/
}

/.*[1-9][0-9] .*/{
        s/.*\([1-9][0-9] .*\)/\1/
}

/.*[0-9] .*/{    # but this is always preferred/executed
        s/.*\([0-9] .*\)/\1/
}

問題は、最初の2つがより制限的であり、最後の3番目が最初の2つを含むため、より「強力」なので実施されないことです。 sedに「優先順位」を使用して最初の2つを取得させる方法はありますか?良い

if the first matches
    do first things
elif the second matches
    do second things
elif the third matches
    do third things

答え1

これらの正規表現のターゲットが何であるかわからず、テストデータがない場合は、必要なのはスクリプトの最後に分岐し、置換が正常に完了したら残りのコード処理をスキップするt分岐です。sed

sed '/regexp1/ s/do/things/; t
     /regexp2/ s/do/things/; t
     /regexp3/ s/do/things/ ' infile

使用する命令に応じて、分岐b(無条件に指定されたラベル、ラベルが省略されている場合はスクリプトの末尾)を使用することもできますsed -e '/regex/{ s/do/things/; b' -e '}; ...'


"man sed"から:

t label
最後の入力行を読んだ後にas / / /が正常に置き換えられた場合はラベルに分岐し、ラベルが省略されている場合は最後のtまたはTコマンドの後にスクリプトの最後に分岐します。

b label は
label に分岐し、label を省略するとスクリプトの末尾に分岐します。

答え2

あなたは何が起こっているのか誤解しました。 Sedは常に一致するすべてのパターンを順番に実行します。問題は、最後のスキーマが最初のスキーマの内容を再編集することです。

また、s///の検索パターンが一致パターンと同じ場合は重複しており、実際にパターン間で変わらないのですが、どのパターンが実行されているのか、どうすればわかりますか?

関連情報