¿Cuál es la diferencia entre la opción grep -e y grep -E?

34

Estoy tratando de entender la diferencia entre grep -ey grep -E. Ahora de grep manpagetengo:

-E, --extended-regexp

Interpreta PATTERN como una expresión regular extendida (ver más abajo).

-e PATRÓN, --regexp = PATRÓN

Use PATTERN como patrón; útil para proteger patrones que comienzan con -

La explicación anterior no tiene sentido para mí.

Entonces, ¿puede alguien explicarme usando examplescuál es la diferencia entre los dos y cuándo usar qué opción?

PS: Versión: grep (GNU grep) 2.10

ronnie
fuente
Ver también: unix.stackexchange.com/questions/17949/…
Caracol mecánico
3
El propósito -ees realmente desambiguar cuando una expresión regular comienza con un guión. Entonces grep ---fooda unrecognized option: ---foopero puedes decir grep -e ---foogrep para la expresión regular ---foo.
tripleee

Respuestas:

29

-ees estrictamente la bandera para indicar el patrón con el que desea hacer coincidir. -Econtrola si necesita escapar de ciertos caracteres especiales.

man greplo explica -Eun poco más:

   Basic vs Extended Regular Expressions
   In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \).

   Traditional  egrep  did  not  support  the  {  meta-character, and some egrep implementations support \{ instead, so portable scripts should avoid { in grep -E patterns and should use [{] to match a
   literal {.

   GNU grep -E attempts to support traditional usage by assuming that { is not special if it would be the start of an invalid interval specification.  For example, the command grep -E '{1' searches for
   the two-character string {1 instead of reporting a syntax error in the regular expression.  POSIX.2 allows this behavior as an extension, but portable scripts should avoid it.
Hafichuk
fuente
2
así que esta es la razón cuando no echo "hello" | grep -o -e 'h|l'obtengo salida porque |perdió su significado especial y cuando lo hago echo "hello" | grep -o -E 'h|l', obtengo la salida deseada.
2
Sí. echo "hello" | grep -o -e 'h' -e 'l'funcionará si quieres tirar la -Ebasura en este caso.
Hafichuk
3
grep -e -o 'h|l'coincidirá literalmente h|lmientras grep -e -o 'h\|l'que coincidirá ho lcon -E es todo lo contrario
Nahuel Fouilleul
@ronnie lo lamentable es que necesita más de 200 reputación de tener esa "característica" que siga entre los sitios ... SE
Hafichuk
5

También grep -epermite utilizar varias cadenas para buscar: 'grep -e 'abc' -e 'def' -e '123'buscará las tres cadenas: abcasí como defy 123.

Esto funciona de manera bastante similar a grep 'abc\|def\|123'donde se \|encuentra, orpero podría ser un poco más claro de leer.

Como los hechos más importantes grep -Eya se explican aquí, solo quiero agregar lo que resumí sobre este tema en una pregunta bastante similar: Expresión regular para encontrar caracteres dobles en Bash

erch
fuente
3

vea abajo

/extendido

grep comprende tres versiones diferentes de la sintaxis de expresión regular: "básica", "extendida" y "perl". En GNU grep, no hay diferencia en la funcionalidad disponible entre las sintaxis básica y extendida. En otras implementaciones, las expresiones regulares básicas son menos potentes. La siguiente descripción se aplica a las expresiones regulares extendidas; Las diferencias para las expresiones regulares básicas se resumen a continuación. Las expresiones regulares de Perl proporcionan funcionalidad adicional y están documentadas en pcresyntax (3) y pcrepattern (3), pero es posible que no estén disponibles en todos los sistemas.

Entonces, una vez más.

En GNU grep, no hay diferencia en la funcionalidad disponible entre sintaxis básica y extendida

ДМИТРИЙ МАЛИКОВ
fuente
2
La funcionalidad es la misma entre básica y extendida, pero la sintaxis es ligeramente diferente. REGEXP caracteres especiales como (, ), |etc necesidad de ser escapados a tener su significado especial en expresión regular básica, pero no en extendido (donde tienen que estar escapó a ser tratado como un literal de cadena)
cas
1

Solo para elaborar sobre la -eopción. -ea menudo es opcional:

grep PATTERN

es idéntico a

grep -e PATTERN

a menos que, como se indicó en una Respuesta anterior y en las páginas del manual, haya múltiples patrones de búsqueda, o para proteger un patrón que comience con un guión (-).

flow2k
fuente