示例任务:如果一行包含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 标签(测试)
仅当自读取最后一个输入行或采用条件分支以来已成功替换时才跳转到标签。标签可以省略,在这种情况下开始下一个循环。