替换一个正则表达式,然后在所有不匹配的行中替换第二个正则表达式

Vla*_*eev 6 sed

示例任务:如果一行包含foo,则将其替换为bar,否则附加baz到该行。

sed -e s/foo/bar/ -e s/$/baz/不起作用,因为无论第一个命令是否匹配,都会执行第二个命令。有没有办法告诉sed比赛结束后转到下一行?

Sun*_*eep 14

您可以使用t不带标签的命令在成功替换后开始下一个循环

$ cat ip.txt 
a foo 123
xyz
fore
1foo

$ sed -e 's/foo/bar/' -e t -e 's/$/baz/' ip.txt
a bar 123
xyzbaz
forebaz
1bar
Run Code Online (Sandbox Code Playgroud)

从手册:

t 标签(测试)

仅当自读取最后一个输入行或采用条件分支以来已成功替换时才跳转到标签。标签可以省略,在这种情况下开始下一个循环。

  • 最好的解决方案。可读、可扩展、无冗余! (2认同)