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

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

O padrão de expressão regular é usado no grepPOSIX+ASCIIou alguma outra coisa está misturada?

Responder1

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

O grep sem bandeira 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 usará 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 básicas versus estendidas

Em expressões regulares básicas, os metacaracteres ?, +, {, |, (e )perdem seu significado especial; em vez disso, use as versões com barra invertida \?, \+, \{, \|, \(e \).

O egrep tradicional não suportava o {metacaractere, e algumas implementações do egrep suportam \{, portanto, os scripts portáteis devem evitar {os padrões grep -E e devem ser usados [{]​​para corresponder a um literal {.

GNU grep -E tenta suportar o uso tradicional assumindo que {não será especial se for o início de uma especificação de intervalo inválida. Por exemplo, o comando grep -E '{1' procura a sequência de dois caracteres {1em vez de relatar um erro de sintaxe na expressão regular. POSIX.2 permite esse comportamento como uma extensão, mas scripts portáteis devem evitá-lo.

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

informação relacionada