sed 不会改变下面代码中的所有模式

sed 不会改变下面代码中的所有模式

我今天正在尝试使用 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”,我想这正是你想要的。

相关内容