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