使用bash计算字符串中子字符串的出现次数

时间:2016-05-05 11:16:23

标签: linux bash shell

its giving count as 2 where as pattern occurred thrice in the string

将字数计为2,其中模式在字符串中出现三次

echo "axxxaaxx" |  grep -o  "xx" | wc -l
echo "axxxaaxx" |  grep -o  "xx"

2 个答案:

答案 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