Coincidir com RH [A-ZA-Z] com grep

3

Como posso combinar com grep a regex RH [A-ZA-Z],  então string inclui RH com dois caracteres que ambos são uma letra entre A e Z?

Eu tentei isso, mas sem sucesso:

 yum list-security --security | awk '{print $1}' | sort | uniq | grep RH[A-ZA-Z]
 Loaded
 RHEA-2014:1307
 RHSA-2014:1326
 RHBA-2014:1388
 RH@A-2014:1389
 RHSA-2014:1392
 RHSA-2014:1389
 RH7A-2014:1392
 RHSAA-2014:1389
 RHMAW-2014:1392

Isso é o que eu esperava:

 RHEA-2014:1307
 RHSA-2014:1326
 RHBA-2014:1388
 RHSA-2014:1392
 RHSA-2014:1389
    
por yael 10.07.2016 / 12:44

1 resposta

10

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.

    
por 10.07.2016 / 13:00