Respuesta técnica: tradicionalmente, egrep
usaba un autómata finito determinista (DFA) internamente mientras grep
usaba un autómata finito no determinista (NFA). En estos días, GNU grep
y egrep
adoptar 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 grep
usa un DFA cuando es posible y vuelve a un NFA cuando se usan referencias inversas .
egrep
en este caso (ogrep
, si se ha sustituidoegrep
congrep
) 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.La "familia" son solo accesos directos a diferentes
grep
opciones (desdeman grep
):fuente
egrep
es solo un acceso directo para elgrep -E
cual permite el uso de expresiones regulares extendidas. Visite la páginaegrep
del 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
egrep
podría ser más rápido que escribirgrep -E
todo el tiempo.fuente
El inconveniente
egrep
es 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.fuente