Sed

如何在 sed 中“優先”某些模式而不是其他模式?

  • March 8, 2022

我有這個 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

分支到標籤;如果省略標籤,則跳轉到腳本末尾。

引用自:https://unix.stackexchange.com/questions/693257