
¿Se utiliza el estándar de expresión regular en grep?POSIX+ASCII¿O se mezcla algo más?
Respuesta1
Todo eso depende de qué banderas le pases a grep.
El grep normal sin bandera (que es lo mismo que pasar -G) usa "expresiones regulares básicas":
-G, --basic-regexp
Interpret PATTERN as a basic regular expression (BRE, see
below). This is the default.
Si especifica -E, utiliza expresiones regulares "extendidas":
-E, --extended-regexp
Interpret PATTERN as an extended regular expression (ERE,
see below). (-E is specified by POSIX.)
Y luego tienes -P para expresiones regulares de Perl (PCRE):
-P, --perl-regexp
Interpret PATTERN as a Perl regular expression. This is highly
experimental and grep -P may warn of unimplemented features.
Expresiones regulares básicas versus extendidas
En expresiones regulares básicas, los metacaracteres ?
, +
, {
, |
, (
y )
pierden su significado especial; en su lugar, utilice las versiones con barra invertida \?
, \+
, \{
, \|
, \(
y \)
.
El egrep tradicional no admitía el {
metacarácter y algunas implementaciones de egrep lo admiten \{
, por lo que los scripts portátiles deben evitar {
los patrones grep -E y deben usarse [{]
para coincidir con un literal {
.
GNU grep -E intenta admitir el uso tradicional asumiendo que {
no es especial si fuera el comienzo de una especificación de intervalo no válida. Por ejemplo, el comando grep -E '{1'
busca la cadena de dos caracteres {1
en lugar de informar un error de sintaxis en la expresión regular. POSIX.2 permite este comportamiento como una extensión, pero los scripts portátiles deberían evitarlo.
Entonces, aunque grep se esfuerza por estar lo más cerca posible de POSIX, todavía tiene algunos defectos.