Estoy tratando de entender la diferencia entre grep -e
y grep -E
. Ahora de grep manpage
obtuve:
-E, –extended-regexp
Interprete PATTERN como una expresión regular extendida (ver más abajo).
-e PATTERN, –regexp = PATTERN
Use PATTERN como patrón; útil para proteger patrones que comienzan con –
La explicación anterior no tiene sentido para mí.
Entonces, ¿alguien puede explicárselo a yo usando examples
¿cuál es la diferencia entre los dos y cuándo usar qué opción?
PS: Versión: grep (GNU grep) 2.10
Comentarios
Responder
-e
es estrictamente la bandera para indicar el patrón con el que desea hacer coincidir. -E
controla si necesitas escapar de ciertos caracteres especiales.
man grep
explica -E
es un 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.
Comentarios
- así que esta es la razón por la que Sí
echo "hello" | grep -o -e 'h|l'
No obtengo resultados porque|
perdió su significado especial y cuando lo hagoecho "hello" | grep -o -E 'h|l'
Obtengo el resultado deseado. - Sí.
echo "hello" | grep -o -e 'h' -e 'l'
funcionará si desea deshacerse de-E
en este caso. -
grep -e -o 'h|l'
coincidirá literalmente conh|l
mientras quegrep -e -o 'h\|l'
coincidirá conh
ol
y con -E ' es lo contrario - @ronnie it ' es desafortunado que necesita más de 200 reputación para tener esa " característica " que lo siga entre los sitios SE …
Respuesta
También grep -e
permite usar varias cadenas para buscar: "grep -e "abc" -e "def" -e "123"
buscará cualquiera de estas tres cadenas: abc
así como def
y 123
.
Esto funciona bastante similar a grep "abc\|def\|123"
donde \|
se encuentra para or
pero c Debería ser un poco más claro de leer.
Como los hechos más importantes sobre grep -E
ya 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
Respuesta
ver más abajo
/ extendido
grep comprende tres versiones diferentes de la sintaxis de expresiones regulares: «básica», «extendida» y «perl». En GNU grep, no hay diferencia en la funcionalidad disponible entre la sintaxis básica y extendida. En otras implementaciones, las expresiones regulares básicas son menos poderosas. La siguiente descripción se aplica a las expresiones regulares extendidas; las diferencias de las expresiones regulares básicas se resumen a continuación. Las expresiones regulares de Perl brindan funcionalidad adicional y están documentadas en pcresyntax (3) y pcrepattern (3), pero pueden no estar disponibles en todos los sistemas.
Entonces , una vez más.
En GNU grep, no hay diferencia en la funcionalidad disponible entre la sintaxis básica y extendida
Comentarios
- la funcionalidad es la misma entre básica y extendida pero la sintaxis es ligeramente diferente. regexp caracteres especiales como
(
,)
,|
, etc.necesitan escaparse de barra invertida para tienen su significado especial en las expresiones regulares básicas, pero no en las extendidas (donde deben escaparse para ser tratados como una cadena literal)
Respuesta
Solo para desarrollar la opción -e
. -e
suele ser 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 de manual, haya múltiples patrones de búsqueda, o para proteger un patrón que comience con un guión (-).
-e
es realmente eliminar la ambigüedad cuando una expresión regular comienza con un guión. Entonces,grep ---foo
daunrecognized option: ---foo
pero puedes decirgrep -e ---foo
para grep para la expresión regular---foo
.