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