如何指示 sed 在使用多個替換表達式時僅替換一次?

如何指示 sed 在使用多個替換表達式時僅替換一次?

我有多個替換規則,但只想使用第一個適用的規則。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

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

相關內容