GNU grep 的 -o 选项是否忽略零长度匹配?

ter*_*don 9 grep text-processing pcre

我在另一个网站上找到了一个建议的答案grep -oP '^\w+|$。我指出|$在 PCRE 中是没有意义的,因为它只是意味着“或行尾”,因此对于常规行总是如此。但是,grep当与-o. 考虑以下:

$ printf 'ab\na\nc\n\n' | perl -ne 'print if /ab|$/'
ab
a
c

$
Run Code Online (Sandbox Code Playgroud)

(我包含第二个提示 ( $) 字符以显示结果中包含空行)。

正如预期的那样,在 Perl 中,这将匹配每一行。可能是因为它包含一个ab或因为$该行的末尾匹配。GNU 的grep行为与没有-o标志的方式相同:

$ printf 'ab\na\nc\n\n' | grep -P 'ab|$'
ab
a
c

$
Run Code Online (Sandbox Code Playgroud)

但是,-o改变了行为:

$ printf 'ab\na\nc\n\n' | grep -oP 'ab|$'
ab
$
Run Code Online (Sandbox Code Playgroud)

这与简单地搜索ab. 第二部分,“OR 行尾”似乎被忽略了。在没有-o标志的情况下,它确实按预期工作:

这是怎么回事?是否o忽略 0 长度匹配?这是一个错误还是预期的?

jes*_*e_b 10

我的 GNU grep 手册页说明如下:

-o, --only-matching

只打印匹配行的匹配(非空)部分,每个这样的部分在单独的输出行上。

重点是我的

我猜它认为行尾匹配是“空匹配”