示例任务:如果一行包含foo
,则将其替换为bar
,否则附加baz
到该行。
sed -e s/foo/bar/ -e s/$/baz/
不起作用,因为无论第一个命令是否匹配,都会执行第二个命令。有没有办法告诉sed
比赛结束后进入下一行?
示例任务:如果一行包含foo
,则将其替换为bar
,否则附加baz
到该行。
sed -e s/foo/bar/ -e s/$/baz/
不起作用,因为无论第一个命令是否匹配,都会执行第二个命令。有没有办法告诉sed
比赛结束后进入下一行?
您可以使用
t
不带标签的命令在成功替换时开始下一个循环从手册:
一种更强大的
awk
脚本方式:甚至更短:
尝试这个:
弄清楚了:
解释:
;
并分组。{
}
/foo/
选择包含该模式的所有行foo
。s//bar/
与s/foo/bar/
- 空模式表示重复上次搜索(在本例中为foo
)。p
表示打印模式空间(替换后的行)。D
表示清除当前行,进入下一行。s/$/baz/
将执行任务的第二部分,即附加baz
到前一条规则要通过的行。