¿Cómo incluir un personaje espacial con grep?

17

Tengo un archivo llamado ejemplo

$ cat example

kali.pdf
linux.pdf
ubuntu.pdf
example.pdf.
this.pdf
grep .pdf

y cuando uso greppara obtener la línea que tiene un espacio antes .pdf, parece que no puedo obtenerlo.

grep *.pdf example

no devuelve nada (quiero decir "grep, coincide con cero o más espacios antes .pdf", pero ningún resultado)

y si uso:

grep i*.pdf example

kali.pdf
linux.pdf
ubuntu.pdf
example.pdf.
this.pdf
grep .pdf

todas las líneas vuelven, porque estoy diciendo "grep, emparejame iuna o cero veces, ok".

y por último:

grep " *.pdf" example

no se devuelve ningún resultado

Para esta muestra, quiero ver

grep .pdf 

como salida

¿Qué hay de malo en mi pensamiento?

solfish
fuente

Respuestas:

31

Asegúrate de citar tu expresión. Creo que la división de palabras de shell es uno de sus problemas aquí, pero siempre debe citar su expresión regular, ya que de lo contrario todo saldrá mal.

$ grep ' \.pdf' example
grep .pdf

O si puede haber varios espacios (no podemos usarlos, *ya que esto coincidirá con los casos en los que no hay espacios anteriores)

grep ' \+\.pdf' example

+significa "uno o más de los caracteres anteriores". En BRE, debe escapar \para obtener esta función especial, pero puede usar ERE en su lugar para evitar esto

grep -E ' +\.pdf' example 

También se puede utilizar \sen grepel sentido de un espacio

grep '\s\+\.pdf' example

Deberíamos escapar literal .porque en regex .significa cualquier carácter, a menos que esté en una clase de caracteres.

Zanna
fuente
Fuiste el primero en notar que la última línea tenía espacio.
Pilot6
@ Pilot6 gracias. La pregunta fue un poco confusamente escrita :)
Zanna
Debería haber alguna insignia para el primero que entendió la pregunta ;-)
Pilot6
@Zanna, ¿hay algo malo para ir en cualquier momento egrep en estos casos? egrep siempre te da ventaja ...
solfish
@solfish egrepes (en términos de estilo de expresiones regulares, que yo sepa) la misma que grep -E, y yo creo que estamos destinados a utilizar este último - egrepetc son supuestamente obsoleto en favor de grepbanderas 's
Zanna