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

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

我在另一个网站上找到了一个建议的答案grep -oP '^\w+|$。我指出这|$在 PCRE 中是没有意义的,因为它只是意味着“OR 行尾”,因此对于常规行来说总是如此。然而,我无法确切地弄清楚它在 GNU grepPCRE 中与-o.考虑以下:

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

$

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

正如预期的那样,在 Perl 中,它将匹配每一行。要么因为它包含一个ab,要么因为它$匹配行尾。没有标志时GNU 的grep行为方式相同-o

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

$

但是,-o改变了行为:

$ printf 'ab\na\nc\n\n' | grep -oP 'ab|$'
ab
$

这与简单地 grep for 相同ab。第二部分,“OR 行尾”似乎被忽略了。它确实按预期工作,没有-o标志:

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

答案1

我的 GNU grep 手册页内容如下:

-o, --仅匹配

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

重点是我的

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

答案2

手术室的两侧

第二部分,“OR 行尾”似乎被忽略了。

不,不是,如果我们稍微改变一下匹配:

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

的两个部分或者是明确匹配的。

空匹配

什么忽略的是“空”匹配(生成的字符串长度为零):

$ printf '%s\n' ab " " a "" c | grep -oP '^.*$'
ab

a
c

它被记录在案(在 GNU grep 中)LESS=+'/^ *-o,' man grep(强调我的):

-o, --仅匹配
Print only the matched (非空) parts of a matching line, with each such part on a separate output line.

相关内容