如果我这样做
# perl -lne "print \$1 if /'?(\d{5})'?:/" courses.yaml
00000
01005
然后我得到了我想要的结果,但现在我想用grep
代替。
为什么以下内容没有为我提供相同的输出?
# grep -oP "\'?(\d{5})\'?:" courses.yaml
'00000':
'01005':
答案 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解析器会更有意义,而且它仍然很短。