【发布时间】:2013-03-28 18:21:55
【问题描述】:
如果我在 bash 中运行此代码:
echo dog dog dos | sed -r 's:dog:log:'
它给出输出:
log dog dos
如何让它替换所有出现的狗?
【问题讨论】:
-
全局替换需要
g标志,这里也不需要-r选项。
如果我在 bash 中运行此代码:
echo dog dog dos | sed -r 's:dog:log:'
它给出输出:
log dog dos
如何让它替换所有出现的狗?
【问题讨论】:
g 标志,这里也不需要-r 选项。
您应该添加 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/
【讨论】:
sed -E 's,foo,bar,g' 不会做全局性的事情。如果你把它改成sed -E -e 's,foo,bar,g' 就可以了。
echo 'dog dog dos\ndog'|sed 's:dog:log:g
你必须在最后加上一个g,它代表“全局”:
echo dog dog dos | sed -r 's:dog:log:g'
^
【讨论】:
man sed,-r 选项的意思是“使用扩展的正则表达式”。所以给定的命令可以正常工作,尽管它不需要扩展正则表达式的功能。