RH[A-ZA-Z]
é uma expressão regular que inclui uma única classe de caracteres que repete o mesmo conjunto de caracteres duas vezes. Corresponde a RH
seguido por qualquer caractere de A
a Z
. Não coloca restrições no quarto caractere, nem requer que haja um quarto caractere.
Obviamente, isso não faz o que você quer.
Tente isto: RH[A-Z][A-Z]
ou (com estendido grep -E
ou perl grep -P
regexps) RH[A-Z]{2}
Além disso, é uma boa ideia colocar aspas simples (ou aspas duplas se você precisar incluir uma variável ou substituição de comando) em torno de expressões regulares para garantir que o shell não tente expandi-las como globs - por exemplo, se você tivesse um nome de arquivo RHAA
no diretório atual, o shell expandiria seu argumento para o RHAA e isso seria all que seu grep
veria:
$ grep RH[A-Z][A-Z] yael.txt | wc -l
7
$ touch RHAA
$ grep RH[A-Z][A-Z] yael.txt | wc -l
0
equivalente a:
$ grep RHAA yael.txt | wc -l
0
mas fica pior. Se você também tiver um arquivo chamado 'RHAB', a linha de comando grep
será expandida para:
grep RHAA RHAB yael.txt
então grep
irá procurar por regexp RHAA
no arquivo RHAB
, assim como stdin e / ou o (s) arquivo (s) nomeado (s) que você deseja pesquisar.
Use grep com aspas em vez disso: grep 'RH[A-Z][A-Z]'
Atualização:
Se você quiser que RH
seja seguido por apenas dois [A-Z]
caracteres (mas não mais que dois), use isso:
grep 'RH[A-Z][A-Z][^A-Z]' yael.txt
A terceira classe de caracteres [^A-Z]
começa com ^
, o que nega ou inverte a classe. Em outras palavras, ele corresponde a qualquer caractere exceto A
a Z
.
E você provavelmente deseja ancorar a correspondência ao início da linha, independentemente de qual versão da expressão regular você usa. Você usa ^
para isso também, mas tem um significado completamente diferente de []
. É a âncora do começo da linha. Por exemplo, isso:
grep '^RH[A-Z][A-Z][^A-Z]' yael.txt
corresponderá apenas às linhas começando com RH[A-Z][A-Z][^A-Z]
e não corresponderá às linhas com esse padrão em nenhum outro lugar.