以下两种写法是等价的:
grep -E '^A|bA'
grep -P '^A|bA'
grep -P '(?<![^b])A'
但第二种方法
grep -P '^A|bA'
要慢得多。为什么呢?它们都找到了同样的内容:一行开头或在一个 b 后面有一个
A
。(等效地说,一行有一个没有被任何东西而只是一个 b
后面跟着的 A
。)第二行是否禁用了某些优化?当
grep
认为这样更快时,它是否会检查多个字符并行处理?除非 ^
或 |
在 perl 中有微妙不同的含义,否则我想不出其他解释。
perl -le'print "bcA" x 10 for 1..10_000' >neg
生成一个文件,展示了OP提到的行为。 - ikegami