¿Cuáles son las ventajas, si alguna de grep sobre egrep


4

Estoy aprendiendo sobre la familia de programas grep, y me parece que egrep es estrictamente superior a grep: puede hacer todo lo que grep puede hacer, pero más. ¿Me equivoco? ¿Por qué no usar egrep siempre?

EDITAR: Sé que grep -E es lo mismo que egrep. Quiero saber por qué grep -E no es el modo predeterminado para grep, ya que solo expande su usabilidad y no tiene inconvenientes aparentes.

Respuestas:


16

Respuesta técnica: tradicionalmente, egrepusaba un autómata finito determinista (DFA) internamente mientras grepusaba un autómata finito no determinista (NFA). En estos días, GNU grepy egrepadoptar un enfoque híbrido NFA / DFA.

Según el libro de Friedl Mastering Regular Expressions , para descubrir si su egrep(por ejemplo) tiene un motor NFA o si tiene un motor DFA, pruebe:

echo =XX========================================= | egrep 'X(.+)+X'

Freidl (p.147) dice:

Si tarda mucho tiempo en terminar, es un NFA ... Si termina rápidamente, es un DFA o un NFA con alguna optimización avanzada. ¿Muestra un mensaje de advertencia sobre un overow de pila o una coincidencia larga anulada? Si es así, es un NFA.

Friedl describe el motor NFA como "dirigido por expresiones regulares" y el DFA como "dirigido por texto". Los detalles de la distinción se describen a partir de la p.153 de su libro en adelante.

La consecuencia es que hay algunas combinaciones de patrones / texto que un DFA hace coincidir más rápidamente y otras que un NFA hace coincidir más rápidamente. Además, la forma en que escribe una expresión regular para un NFA puede tener un efecto significativo en la velocidad de coincidencia. A menudo, un DFA será más rápido, pero los DFA no admiten la coincidencia diferida, coinciden de manera diferente en algunos casos, no pueden hacer expresiones de búsqueda o referencias inversas, y omiten algunas otras características en comparación con los NFA.

Según Freidl, GNU grepusa un DFA cuando es posible y vuelve a un NFA cuando se usan referencias inversas .


En el fragmento de código, ¿se supone que es 'egrep' o 'grep'? Por lo que ha escrito, "egrep = DFA", por lo que no debería tomar mucho tiempo terminar, como "egrep! = NFA".
Nevin Williams

Creo Friedl significa que el ejemplo muestra si egrepen este caso (o grep, si se ha sustituido egrepcon grep) es el uso de un DFA o NFA. Dado que, como han señalado otras respuestas, que diferentes implementaciones de la misma herramienta pueden usar diferentes motores de expresiones regulares, el hecho de que una herramienta dada tradicionalmente usara un motor particular no significa que una implementación particular de esa herramienta necesariamente use el mismo tipo de motor.
Simon

2

La "familia" son solo accesos directos a diferentes grepopciones (desde man grep):

Además, hay disponibles tres programas variantes egrep , fgrep y rgrep . egrep es lo mismo que grep -E . fgrep es lo mismo que grep -F . rgrep es lo mismo que grep -r . La invocación directa como egrep o fgrep está en desuso, pero se proporciona para permitir que las aplicaciones históricas que dependen de ellas se ejecuten sin modificaciones.

   -E, --extended-regexp
          Interpret  PATTERN  as  an  extended   regular
          expression (ERE, see below).  (-E is specified
          by POSIX.)

   -F, --fixed-strings
          Interpret PATTERN as a list of fixed  strings,
          separated  by  newlines, any of which is to be
          matched.  (-F is specified by POSIX.)

   -R, -r, --recursive
          Read   all   files   under   each   directory,
          recursively;  this  is  equivalent  to  the -d
          recurse option.

1

egrepes solo un acceso directo para el grep -Ecual permite el uso de expresiones regulares extendidas. Visite la página egrepdel manual para ver la página del manual de la "familia" de funciones de búsqueda de patrones como grep, egrep, fgrep, etc.

En cuanto al uso, si usa expresiones regulares extendidas, entonces escribir egreppodría ser más rápido que escribir grep -Etodo el tiempo.


0

El inconveniente egrepes que su expresión regular es un poco más compleja y menos conveniente si no necesita la capacidad adicional. A veces, más potencia no es mejor si no es tan simple y fácil de usar.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.