Explicação
Normalmente, pesquisar TTT (3 T's) em TTTTTT (6 T's) rende apenas 2 correspondências porque a pesquisa da próxima correspondência é feita logo após a correspondência anterior ser encontrada.
Vou tentar ilustrar:
TTTTTT
^ set starting position
TTTTTT
‾‾‾ found a match for TTT
TTTTTT
‾‾‾^ set next starting position
TTTTTT
‾‾‾ found a match for TTT
TTTTTT
^ end of stream
Solução
Se você quiser considerar TTTTTT como quatro instâncias de TTT , sugiro que corresponda apenas a um único caractere e use lookaround para completar seu padrão de correspondência.
Vou usar um lookahead na minha solução:
head -2000 file | /usr/gnu/bin/grep -P -o 'T(?=TT)' | wc -l
Explicações para a parte grep :
- Use um
grep que suporte a expressão regular Perl para usar lookahead; no meu sistema eu preciso especificar isso para /usr/gnu/bin/grep
-
-P para ativar o modo de expressão regular Perl
-
-o para exibir cada ocorrência em uma linha separada para permitir que wc -l conte cada correspondência
-
'T(?=TT)' é uma expressão regular para corresponder a T , que é seguido por TT (usando uma lookahead); Depois de encontrar uma correspondência, o mecanismo de expressões regulares começará no segundo T para tentar encontrar a próxima correspondência, permitindo que essa segunda T faça parte o próximo jogo se estiver de acordo com o padrão.
Exemplo
Usando sua string de amostra do comentário:
- JKHFSDTTTJSDJHTTTTTKSJTIITTT
e processando-o com o regex acima:
echo 'JKHFSDTTTJSDJHTTTTTKSJTIITTT' | /usr/gnu/bin/grep -P --color=always 'T(?=TT)'
produzirá:
- JKHFSD T TTJSDJH TTT TTKSJTII T TT (ou seja, destacará 5 T's)
o que significa:
- encontra 5 correspondências:)
Ilustração:
JKHFSDTTTJSDJHTTTTTKSJTIITTT
^ set starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
^ end of stream