为什么sed不会替换所有出现的事件?

nia*_*agr 105 bash sed

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

echo dog dog dos | sed -r 's:dog:log:'
Run Code Online (Sandbox Code Playgroud)

它给出了输出:

log dog dos
Run Code Online (Sandbox Code Playgroud)

我怎样才能让它取代所有出现的狗?

Bru*_*eis 171

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

echo dog dog dos | sed -e 's:dog:log:g'
Run Code Online (Sandbox Code Playgroud)

有关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/上找到.

  • 在这里为 GNU sed 添加一个角落案例:`sed -E 's,foo,bar,g'` 不做全局的事情。如果您将其更改为 `sed -E -e 's,foo,bar,g'` 它可以工作。 (2认同)

ale*_*nis 23

你必须把g它放在最后,它代表"全球":

echo dog dog dos | sed -r 's:dog:log:g'
                                     ^
Run Code Online (Sandbox Code Playgroud)

  • @DylanDaniels 根据 Ubuntu 上的 `man sed`,`-r` 选项的意思是“使用扩展的正则表达式”。所以给定的命令工作正常,虽然它不需要扩展正则表达式的功能来工作。 (2认同)