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".

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 *

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.


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.



5

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

grep -r "0[.]49"

4

Ponto de escape. O comando de amostra será.

grep '0\.00'

4

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

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


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.


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"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.