Usando grep para procurar uma string que contenha um ponto

193

Estou tentando procurar uma string 0.49(com ponto) usando o comando

grep -r "0.49" *

Mas o que está acontecendo é que também estou obtendo resultados indesejados que contêm a string, como 0449, 0949etc , . O problema é o linux, considerando o ponto (.) Como qualquer caractere e apresentando todos os resultados. Mas eu quero obter o resultado apenas para "0,49".

Varun kumar
fonte

Respostas:

233

grepusa expressões regulares; .significa "qualquer caractere" em uma regex. Se você quer uma string literal, use grep -F, fgrepou escapar do .a \..

Não se esqueça de colocar sua string entre aspas duplas. Ou então você deve usar\\.

Portanto, seu comando precisaria ser:

grep -r "0\.49" *

ou

grep -r 0\\.49 *

ou

grep -Fr 0.49 *
geekosaur
fonte
58
Eu precisava escapar duas vezes \\.para que funcionasse. Estou usando o zsh.
Nikos Renieris
5
@NikosRenieris você embrulhou sua string de grepping com aspas duplas?
precisa saber é o seguinte
@JustusRomijn Acho que sim, sim.
Nikos Renieris
15
você precisará usar o \\.bash também, ou usar "\."para escapar do shell.
Tomofumi
36

grep -F -r '0.49' *trata 0,49 como uma string "fixa" em vez de uma expressão regular. Isso faz .perder seu significado especial.

Joni
fonte
22

Você precisa escapar do .as "0\.49".

A .é um meta-caractere de expressão regular para corresponder a qualquer caractere (exceto nova linha). Para corresponder a um período literal, você precisa escapar dele.

codaddict
fonte
6

Apenas escape do .

grep -r "0\.49"

cppcoder
fonte
5

Você também pode usar "[.]"

grep -r "0[.]49"
skan
fonte
4

Ponto de escape. O comando de amostra será.

grep '0\.00'
tuxuday
fonte
4

Você pode escapar do ponto e de outros caracteres especiais usando \

por exemplo. grep -r "0 \ .49"

Kevin Davis
fonte
Um lembrete para o futuro leitor, \.cercado por aspas, é necessário para fazê-lo funcionar.
Fruit
4

Há muitas respostas aqui sugerindo escapar do ponto, \.mas eu estive enfrentando esse problema repetidamente: \.me dá o mesmo resultado que.

No entanto, essas duas expressões funcionam para mim:

$ grep -r 0\\.49 *

E:

$ grep -r 0[.]49 *

Estou usando um shell bash "normal" no Ubuntu e Archlinux.

Afr
fonte
3
Você precisa citar o regex do shell ou escapar da barra invertida para que o shell não o consuma. grep '\.'ou grep \\.(eu recomendaria fortemente o primeiro. As aspas duplas também funcionam, como na pergunta original; mas as aspas simples são mais fáceis de entender e usar. Por exemplo, com aspas duplas, você ainda precisará dobrar a barra invertida em alguns cenários )
Tripleee 07/07
IMHO, esta é a resposta correta mais clara, com o comentário de @tripleee é a mais completa. o uso de [] (que funciona para representar um subconjunto de caracteres para combinar com um único caractere) é um bom truque.
Jringoot #
@jringoot Sério? Acho que isso não está claro - parece mais uma pergunta de acompanhamento de alguém que não estava familiarizado com a citação.
Tripleee
É claro porque ambas as expressões funcionam diretamente e, de fato, muitas outras assumem a citação ou precisam escapar em dobro para evitar a interpretação secundária do shell como trivial. Não posso mais alterar o comentário (limite de 5 minutos). Meu comentário poderia ter sido melhor: "isto, se combinado com o comentário de @tripleee é a resposta mais completa Porque ambos os comandos funcionam imediatamente e com a citação é completa."
jringoot
1
O que eu normalmente recomendo é "sempre aspas simples suas expressões regulares". Não é "completo", mas realiza o trabalho e implica que você precisa entender as aspas ou seguir essa regra simples.
Tripleee 07/08/19
0

Você também pode pesquisar com a opção - que basicamente ignora todos os caracteres especiais e não será interpretada pelo grep.

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