【问题标题】:Why does sed not replace all occurrences?为什么 sed 不替换所有出现的事件?
【发布时间】:2013-03-28 18:21:55
【问题描述】:

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

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

它给出输出:

log dog dos

如何让它替换所有出现的狗?

【问题讨论】:

  • 全局替换需要g 标志,这里也不需要-r 选项。

标签: bash sed


【解决方案1】:

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

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

有关 sed 的精彩文档,请查看 http://www.grymoire.com/Unix/Sed.html。这个 global 标志在这里解释: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' 就可以了。
  • 如果你想替换所有行和其他行,它也可以工作:echo 'dog dog dos\ndog'|sed 's:dog:log:g
【解决方案2】:

你必须在最后加上一个g,它代表“全局”:

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

【讨论】:

  • sed -e 应该被使用而不是 sed -r,它不存在。
  • @DylanDaniels 根据 Ubuntu 上的man sed-r 选项的意思是“使用扩展的正则表达式”。所以给定的命令可以正常工作,尽管它不需要扩展正则表达式的功能。
猜你喜欢
  • 1970-01-01
  • 2023-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2019-08-18
  • 2015-10-27
相关资源
最近更新 更多