我知道 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 就不会再寻找可能更贪婪的后续匹配。