Usando el signo de la estrella en grep

Estoy tratando de buscar la subcadena “abc” en un archivo específico en linux / bash

Así que hago:

grep '*abc*' myFile 

No devuelve nada.

Pero si lo hago:

 grep 'abc' myFile 

Devuelve las coincidencias correctamente.

Ahora, esto no es un problema para mí. Pero, ¿y si quiero grep para una cadena más compleja, decir

 *abc * def * 

¿Cómo lo lograría usando grep?

El asterisco es solo un operador de repetición , pero necesita decirle lo que repite. /*abc*/ coincide con una cadena que contiene ab y cero o más c (porque el segundo * está en la c; el primero no tiene sentido porque no hay nada que repetir). Si quiere hacer coincidir algo, necesita decir .* – el punto significa cualquier carácter ( dentro de ciertas pautas ). Si solo quieres grep 'abc' myFile abc, puedes simplemente decir grep 'abc' myFile . Para su coincidencia más compleja, debe usar .*grep 'abc.*def' myFile coincidirá con una cadena que contenga abc seguida de def con algo opcionalmente en el medio.

Actualización basada en un comentario:

* en una expresión regular no es exactamente igual a * en la consola. En la consola, * es parte de una construcción global , y solo actúa como un comodín (por ejemplo, ls *.log enumerará todos los archivos que terminan en .log). Sin embargo, en expresiones regulares, * es un modificador, lo que significa que solo se aplica al personaje o grupo que lo precede. Si desea que * en las expresiones regulares actúe como un comodín, debe usar .* Como se mencionó anteriormente: el punto es un carácter comodín, y la estrella, al modificar el punto, significa encontrar uno o más puntos; es decir. encuentra uno o más de cualquier personaje.

El carácter de punto significa que coincide con cualquier carácter, por lo que ‘. *’ Significa cero o más ocurrencias de cualquier carácter. Probablemente quieras usar ‘. *’ En lugar de solo ‘*’.

Oh, mierda,

El “signo de estrella” solo tiene sentido si hay algo delante de él. Si no hay una herramienta (grep en este caso) puede tratarlo como un error. Por ejemplo:

 '*xyz' is meaningless 'a*xyz' means zero or more occurrences of 'a' followed by xyz 

La expresión que probó, como las que funcionan en la línea de comandos del shell en Linux, por ejemplo, se llama ” glob “. Las expresiones Glob no son expresiones regulares completas, que es lo que usa grep para especificar las cadenas que se deben buscar. Aquí está (viejo, pequeño) mensaje sobre las diferencias. Las expresiones globales (como en “ls *”) son interpretadas por el propio shell.

Es posible traducir de globs a REs, pero normalmente debe hacerlo en su cabeza.

No estás utilizando expresiones regulares, por lo que tu variante grep de elección debe ser fgrep , que se comportará como lo esperas.

Pruebe grep -E para obtener soporte extendido para expresiones regulares

También eche un vistazo a:

La página man de grep

Use grep -P, que habilita la compatibilidad con las expresiones regulares del estilo Perl.

 grep -P "abc.*def" myfile 

Esta puede ser la respuesta que estás buscando:

 grep abc MyFile | grep def 

Lo único es … las líneas de salida serán “def” antes o después de “abc”

‘*’ funciona como un modificador para el elemento anterior. Así que ‘abc * def’ busca ‘ab’ seguido de 0 o más ‘c’s seguidas por’ def ‘.

Lo que probablemente quiera es ‘abc. * Def’ que busca ‘abc’ seguido de cualquier número de caracteres, seguido de ‘def’.