2016-05-05 21 views
1

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

这是给数作为2,其中作为模式串中发生三次

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

回答

1

使用-P将使PCRE支持lookarounds

echo "axxxaaxx" | grep -P '(?<=x)x' 

在这种情况下,我们使用的是回顾后,这意味着我们将匹配x这之前有一个x。这使我们能够有重叠的匹配:

如何在正则表达式是“评价”:

xxx 
^^ 
|Cursor 
Looking for x on this position, since there is nothing this will not match 

xxx 
^^ 
|Cursor 
Looking for x on this position since it's found we got a match 

xxx 
    ^^ 
    |Cursor 
    Looking for x on this position since it's found we got a match 
+0

谢谢。这是有效的这种情况,但我试图实现这一点: 给定一个字符串,返回一个子字符串长度2出现在字符串中的次数和字符串的最后2个字符的次数,所以“ hixxxhi“产生1(我们不会计算结束子字符串)。 last2('hixxhi')→1 last2('xaxxaxaxx')→1 last2('axxxaaxx')→2 – user2481458

2

grep犯规支持重叠的正则表达式的匹配计数没有一个子字符串的出现次数的字符串中。它消耗匹配的字符。在这种情况下,你可以使用-p开关使Perl兼容的正则表达式(PCRE),并使用正前方看说法是这样的:

$ echo "axxxaaxx" | grep -oP "x(?=x)" 
x 
x 
x 
$ echo "axxxaaxx" | grep -oP "x(?=x)" | wc -l 
3 
$ 

regex(?=regex2)积极向前看断言认定regex2如下所有regex1之后。虽然匹配的字符为regex2它不会消耗字符,因此这就是您获得3个匹配的原因。

x(?=x)积极向前看断言找到所有x它后面有x

在串xxx,1 x比赛,因为它有x后,第2 x太和第三x没有。

更多信息,方便的例子可以发现here

+1

能否请您解释一下什么魔法(= X?)呢? – user2481458

+0

这是http://stackoverflow.com/questions/37050030/no-of-occurences-of-patterns-in-string/37050288#37050288的子部分 – user2481458