将字数计为2,其中模式在字符串中出现三次
echo "axxxaaxx" | grep -o "xx" | wc -l
echo "axxxaaxx" | grep -o "xx"
答案 0 :(得分:2)
grep
不支持正则表达式的重叠匹配。它会消耗匹配的字符。在这种情况下,您可以使用-p
开关启用Perl Compatible Regex(PCRE),并使用正向预测断言,如下所示:
$ echo "axxxaaxx" | grep -oP "x(?=x)"
x
x
x
$ echo "axxxaaxx" | grep -oP "x(?=x)" | wc -l
3
$
regex(?=regex2)
肯定前瞻断言会查找regex1
之后的所有regex2
。匹配regex2
的字符时,它不会消耗字符,因此这就是你获得3场比赛的原因。
x(?=x)
肯定前瞻断言会找到所有x
之后的x
。
在字符串xxx
中,第一个x
匹配,因为它后面有x
,第二个x
,第三x
没有。
可以找到更多信息和简单示例here
答案 1 :(得分:1)
使用-P
将启用支持lookarounds的PCRE:
echo "axxxaaxx" | grep -P '(?<=x)x'
在这种情况下,我们使用了lookbehind,这意味着我们将匹配前面有x
的{{1}}。这使我们能够重叠匹配:
如何“评估”正则表达式:
x