我有这个 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
分支到脚本的末尾,并在成功替换完成后跳过处理其余代码。根据您使用的命令,您也可以使用
b
分支(无条件分支到指定的标签,或者如果标签省略,则到脚本的末尾)sed -e '/regex/{ s/do/things/; b' -e '}; ...'
。来自“男人 sed”:
你误解了正在发生的事情。Sed 总是按顺序执行所有匹配的模式。问题是最后一个模式正在重新编辑第一个模式。
此外,如果 s/// 上的搜索模式与匹配模式相同,则它是多余的,并且您实际上并没有在它们之间进行不同的更改,那么您怎么知道它运行的是哪一个呢?