
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 {1
em 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.