sed为什么不能取代所有情况?


118

如果我在bash中运行此代码:

echo dog dog dos | sed -r 's:dog:log:'

它给出输出:

log dog dos

如何使它代替所有出现的狗?


2
您需要g用于全局替换的标志,这里也不需要该-r选项。
克里斯·西摩

Answers:


188

您应该添加g修饰符,以便sed 对模式缓冲区的内容执行全局替换:

echo dog dog dos | sed -e 's:dog:log:g'

有关sed的出色文档,请访问http://www.grymoire.com/Unix/Sed.html。此处说明了此全局标志:http : //www.grymoire.com/Unix/Sed.html#uh-6

有关的官方文档,GNU sed请访问http://www.gnu.org/software/sed/manual/


1
在这里为GNU sed添加一个极端情况:sed -E 's,foo,bar,g'不会做全局性的事情。如果将其更改为sed -E -e 's,foo,bar,g'有效。
Melvyn Sopacua '18

23

您必须g在末尾放置一个,它代表“全局”:

echo dog dog dos | sed -r 's:dog:log:g'
                                     ^

1
应该使用sed -e代替不存在的sed -r。
迪伦·丹尼尔斯

1
@DylanDaniels man sed在Ubuntu上,该-r选项表示“使用扩展的正则表达式”。因此,尽管不需要扩展正则表达式的功能,但给定命令可以正常工作。
Craig McQueen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.