如何指示 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

相关内容