sed 在匹配模式方面有多贪婪?

sed 在匹配模式方面有多贪婪?

我知道 sed 在匹配模式时很贪婪。但是,它到底有多贪婪?

考虑一下这些例子。

$ echo 'foobar123' | sed 's/[0-9]*/(&)/'
()foobar123
$ echo 'foobar123' | sed 's/[0-9][0-9]*/(&)/'
foobar(123)

为什么第二个示例不打印foobar(1)23而是打印foobar(123)

答案1

它贪婪到了极点。

第一个模式(“任意数字零次或多次”)在任何地方都匹配,但是在您的示例中只匹配一次,因为没有g标志。

比较:

$ echo foobar123 | sed 's/[0-9]*/(&)/g'
()f()o()o()b()a()r(123)

请注意它是如何尽快变得贪婪的,也就是说,有超过零的数字可以被消耗。

第二种模式也是一样(“任意一位数字,加上任意一位数字零次或多次”)。不能匹配 之前的任意位置123。一旦到达那里,它会消耗尽可能多的。

答案2

造成混淆的原因是

1) sed 尽早匹配(因此是第一个例子)
2) sed * 尽可能贪婪(因此是第二个例子)

在单匹配模式下,一旦找到匹配,sed 就不会再寻找可能更贪婪的后续匹配。

相关内容