web-dev-qa-db-fra.com

Utiliser grep pour rechercher une chaîne contenant un point

J'essaie de rechercher une chaîne 0.49 (avec un point) à l'aide de la commande

grep -r "0.49" *

Mais ce qui se passe, c’est que je reçois également des résultats indésirables contenant la chaîne telle que 0449, 0949 etc ,. La chose est linux considérant le point (.) Comme n'importe quel personnage et faisant ressortir tous les résultats. Mais je veux obtenir le résultat uniquement pour "0.49".

156
Varun kumar

grep utilise des expressions rationnelles; . signifie "n'importe quel caractère" dans une regex. Si vous voulez une chaîne littérale, utilisez grep -F, fgrep ou échappez le . à \..

N'oubliez pas de mettre votre chaîne entre guillemets. Sinon, vous devriez utiliser \\.

Donc, votre commande devrait être:

grep -r "0\.49" *

ou

grep -r 0\\.49 *

ou

grep -Fr 0.49 *
194
geekosaur

grep -F -r '0.49' * traite 0.49 comme une chaîne "fixe" au lieu d'une expression régulière. Cela fait que . perd sa signification particulière.

33
Joni

Vous devez vous échapper du . comme "0\.49".

Un . est un méta-caractère de regex destiné à correspondre à tout caractère (à l'exception de la nouvelle ligne). Pour correspondre à une période littérale, vous devez y échapper.

20
codaddict

Juste échapper à la .

grep -r "0\.49"

6
cppcoder

Vous pouvez échapper au point et à d’autres caractères spéciaux en utilisant \

par exemple. grep -r "0\.49"

4
Kevin Davis

Vous pouvez aussi utiliser "[.]"

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

Point d'échappement. Exemple de commande sera.

grep '0\.00'
3
tuxuday

Il y a tellement de réponses ici qui suggèrent d'échapper au point avec \. mais j'ai été confronté à ce problème encore et encore: \. me donne le même résultat que .

Cependant, ces deux expressions fonctionnent pour moi:

$ grep -r 0\\.49 *

Et:

$ grep -r 0[.]49 *

J'utilise un shell bash "normal" sous Ubuntu et Archlinux.

3
Waqar Lim