Qual padrão de expressão regular é usado no grep?

0

O padrão de expressão regular usado no grep POSIX + ASCII ou algo mais está misturado?

    
por Denys S. 12.04.2011 / 12:07

1 resposta

3

Tudo depende de quais flags você passa para o grep.

O grep flagless normal (que é o mesmo que passar -G) usa "Expressões regulares básicas":

-G, --basic-regexp
    Interpret PATTERN as a basic regular expression (BRE, see 
    below).  This is the default.

Se você especificar -E, ele usa expressões regulares "Estendidas":

-E, --extended-regexp
    Interpret PATTERN as an extended regular expression (ERE, 
    see below).  (-E is specified by POSIX.)

E então você tem -P para expressões regulares Perl (PCRE):

-P, --perl-regexp
    Interpret PATTERN as a Perl regular expression.  This is highly 
    experimental and grep -P may warn  of  unimplemented features.

Expressões regulares estendidas versus básicas

Em expressões regulares básicas, os meta-caracteres?, +, {, |, (e) perdem seu significado especial; Em vez disso, use as versões invertidas \ ?, +, {, \ |, (e).

O egrep tradicional não suportava o {meta-caractere, e algumas implementações egrep suportam {em vez disso, os scripts portáveis devem evitar {em padrões grep -E e devem usar [{] para corresponder a um literal {.

GNU grep -E tenta suportar o uso tradicional supondo que {não é especial se for o início de uma especificação de intervalo inválido. Por exemplo, o comando grep -E '{1' procura pela cadeia de dois caracteres {1 em vez de relatar um erro de sintaxe na expressão regular. O POSIX.2 permite este comportamento como uma extensão, mas os scripts portáteis devem evitá-lo.

Assim, embora o grep se esforce para ser o mais próximo possível do POSIX, ainda existem algumas falhas nele.

    
por 12.04.2011 / 13:16