我今天正在尝试使用 sed,但有一个问题。为什么下面的代码没有改变所有的“天”?
echo 'day night day' | sed 's/day/night/'
输出为:
夜 夜 白天
但我认为它会改变所有的“日子”请帮助我理解如何做到这一点以及为什么它没有改变这一点。谢谢
答案1
要在一行中进行多个替换,必须添加g
(全局)标志:
$ echo 'day night day' | sed 's/day/night/g'
night night night
您还可以使用数字代替g
仅替换第个实例:
$ echo 'day night day night day' | sed 's/day/night/2'
day night night night day
正如所指出的GNU sed 文档:
注意:POSIX 标准没有指定混合使用 g 和数字修饰符时会发生什么情况,目前 sed 实现中没有广泛认可的含义。对于 GNU sed,交互定义为:忽略数字之前的匹配,然后匹配并替换数字之后的所有匹配。
由于 Ubuntu 使用 GNU sed,因此它的行为确实是这样的:
$ echo 'day night day night day' | sed 's/day/night/2g'
day night night night night
答案2
默认情况下,sed 不是“贪婪的”。如果你的正则表达式是“s/day/night/g”,那么你的输出将是“night night night”,我想这正是你想要的。