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/ }
問題是前兩個限制性更強,並且它們沒有被執行,因為最後第三個更“強大”,因為它包括前兩個。有沒有辦法讓 sed 採用“優先順序”的前兩個?喜歡
if the first matches do first things elif the second matches do second things elif the third matches do third things
在不知道您使用這些 Regexp 的目標是什麼並且沒有測試數據的情況下,您需要一個
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 '}; ...'
。來自“男人 sed”:
t label
如果 as/// 自最後一個輸入行被讀取並且自最後一個 t 或 T 命令以來已成功完成替換,則分支到 label;如果省略標籤,則跳轉到腳本末尾。
b label
分支到標籤;如果省略標籤,則跳轉到腳本末尾。