我有多个替换规则,但只想使用第一个适用的规则。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