Usar grep para buscar una cadena que tenga un punto

193

Estoy tratando de buscar una cadena 0.49 (con punto) usando el comando

grep -r "0.49" *

Pero lo que sucede es que también obtengo resultados no deseados que contienen cadenas como 0449, 0949etc. La cuestión es que Linux considera el punto (.) Como cualquier personaje y saca todos los resultados. Pero quiero obtener el resultado solo para "0.49".

Varun kumar
fuente

Respuestas:

233

grepusa expresiones regulares; .significa "cualquier personaje" en una expresión regular. Si quieres una cadena literal, utiliza grep -F, fgrepo escapar de la .a \..

No olvides envolver tu cadena entre comillas dobles. O de lo contrario deberías usar\\.

Entonces, su comando debería ser:

grep -r "0\.49" *

o

grep -r 0\\.49 *

o

grep -Fr 0.49 *
geekosaur
fuente
58
Necesitaba escapar dos veces \\.para que funcione. Estoy usando zsh.
Nikos Renieris
55
@NikosRenieris, ¿envolvió su cadena grepping con comillas dobles?
Justus Romijn
@JustusRomijn Creo que sí, sí.
Nikos Renieris
15
también necesitarás usar \\.para bash, o usar "\."para escapar del shell.
Tomofumi
36

grep -F -r '0.49' *trata 0.49 como una cadena "fija" en lugar de una expresión regular. Esto hace que .pierda su significado especial.

Joni
fuente
22

Necesitas escapar del .as "0\.49".

A .es un meta-carácter regex para coincidir con cualquier carácter (excepto la nueva línea). Para coincidir con un período literal, debe escapar de él.

codictorio
fuente
6

Solo escapa del .

grep -r "0\.49"

cppcoder
fuente
5

También puedes usar "[.]"

grep -r "0[.]49"
skan
fuente
5

Hay tantas respuestas aquí que sugieren escapar del punto, \.pero me he encontrado con este problema una y otra vez: \.me da el mismo resultado que.

Sin embargo, estas dos expresiones funcionan para mí:

$ grep -r 0\\.49 *

Y:

$ grep -r 0[.]49 *

Estoy usando un shell bash "normal" en Ubuntu y Archlinux.

Afr
fuente
3
Debe citar la expresión regular del shell o escapar de la barra diagonal inversa para que el shell no la consuma. grep '\.'o grep \\.(recomendaría encarecidamente el primero. Las comillas dobles también funcionan, como en la pregunta original; pero las comillas simples son más fáciles de entender y usar. Por ejemplo, con comillas dobles, aún necesitaría duplicar la barra diagonal inversa en algunos escenarios )
tripleee
En mi humilde opinión, esta es la respuesta correcta más clara, con el comentario de @tripleee es la más completa. El uso de [] (que funciona para representar un subconjunto de caracteres para que coincida con un solo carácter) es un buen truco.
jringoot
@jringoot ¿En serio? Creo que esto no está claro en absoluto: se parece más a una pregunta de seguimiento de alguien que no estaba familiarizado con las citas.
tripleee
Está claro porque ambas expresiones funcionan directamente y, de hecho, muchas otras asumen la cita o necesitan doble escape para evitar una interpretación secundaria por parte del shell como trivial. Ya no puedo cambiar el comentario (límite de 5 minutos). Mi comentario podría haber sido mejor: "esto, si se combina con el comentario de @tripleee, es la respuesta más completa. Debido a que ambos comandos funcionan de inmediato y con la cita está completa"
jringoot
1
Lo que generalmente recomiendo es "siempre entre comillas simples sus expresiones regulares". No está "completo", pero hace el trabajo e implica que usted necesita entender las citas o seguir esta simple regla.
tripleee
4

Escape dot. El comando de muestra será.

grep '0\.00'
tuxuday
fuente
4

Puede escapar del punto y otros caracteres especiales usando \

p.ej. grep -r "0 \ .49"

Kevin Davis
fuente
Un recordatorio para el futuro lector, \.rodeado de citas es necesario para que funcione.
Fruta
1

También puede buscar con - opción que básicamente ignora todos los caracteres especiales y no será interpretada por grep.

$ cat foo |grep -- "0\.49"
smc
fuente