grep只能打印匹配的缓冲区吗?

时间:2016-08-18 12:47:51

标签: regex linux bash perl grep

如果我这样做

# perl -lne "print \$1 if /'?(\d{5})'?:/" courses.yaml
00000
01005

然后我得到了我想要的结果,但现在我想用grep代替。

为什么以下内容没有为我提供相同的输出?

# grep -oP "\'?(\d{5})\'?:" courses.yaml 
'00000':
'01005':

2 个答案:

答案 0 :(得分:3)

您在第一种情况下打印第1组内容,在第二种情况下打印整个匹配。将grep-oP一起使用时,您只能打印整个匹配,因此,如果有(?='?:),则使用:前瞻,只会返回5位数的数据块在它们之后加上可选的单引号:

echo "'00000':  '01005':" | grep -Po "\d{5}(?='?:)"

请参阅demo

我认为在这里使用lookbehind是没有意义的,因为'在你的模式中是可选的。

答案 1 :(得分:0)

-o输出匹配项($&),而不是第一次捕获($1)。

您可以使用\K,后视和/或预测来控制被视为匹配的内容。

在您的情况下,您可以使用以下内容:

grep -oP "'?\K\d{5}(?='?:)" courses.yaml 

但这简化为以下内容:

grep -oP "\d{5}(?='?:)" courses.yaml 

使用正确的YAML解析器会更有意义,而且它仍然很短。