Utilisation de grep pour rechercher une chaîne contenant un point


196

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 j'obtiens également des résultats indésirables contenant la chaîne telle que 0449, 0949etc. Le truc, c'est que linux considère dot (.) Comme n'importe quel caractère et fait ressortir tous les résultats. Mais je veux obtenir le résultat uniquement pour "0.49".

Réponses:


238

greputilise des expressions régulières; .signifie "n'importe quel caractère" dans une regex. Si vous voulez une chaîne littérale, utilisez grep -F, fgrepou échapper à la .à\. .

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

Donc, votre commande devrait être:

grep -r "0\.49" *

ou

grep -r 0\\.49 *

ou

grep -Fr 0.49 *

58
J'avais besoin de m'échapper deux fois comme ça \\.pour que ça marche. J'utilise zsh.
Nikos Renieris

5
@NikosRenieris avez-vous enveloppé votre chaîne de grepping avec des guillemets doubles?
Justus Romijn

@ JustusRomijn Je pense que je l'ai fait, ouais.
Nikos Renieris

15
vous devrez également utiliser \\.pour bash, ou utiliser "\."pour l'échapper du shell.
Tomofumi

36

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


22

Vous devez échapper au fichier .as "0\.49".

A .est un méta-caractère regex pour correspondre à n'importe quel caractère (sauf nouvelle ligne). Pour correspondre à une période littérale, vous devez y échapper.



5

Vous pouvez aussi utiliser "[.]"

grep -r "0[.]49"

5

Il y a tellement de réponses ici suggérant d'échapper au point avec \.mais j'ai rencontré 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" sur Ubuntu et Archlinux.

Modifier, ou, selon les commentaires:

$ grep -r '0\.49' *

Remarquez que les guillemets simples font la différence ici.


3
Vous devez citer l'expression rationnelle du shell, ou échapper la barre oblique inverse elle-même pour que le shell ne la consomme pas. grep '\.'ou grep \\.(je recommanderais fortement le premier. Les guillemets doubles fonctionnent aussi, comme dans la question d'origine; mais les guillemets simples sont plus faciles à comprendre et à utiliser. Par exemple, avec des guillemets doubles, vous devrez quand même doubler la barre oblique inverse dans certains scénarios ).
tripleee

À mon humble avis, c'est la réponse correcte la plus claire, avec le commentaire de @tripleee, c'est la plus complète. l'utilisation de [] (qui fonctionne pour représenter un sous-ensemble de caractères auquel faire correspondre un seul caractère) est un bon hack.
jringoot

@jringoot Sérieusement? Je pense que ce n'est pas du tout clair - cela ressemble plus à une question de suivi de quelqu'un qui n'était pas familier avec les citations.
tripleee

C'est clair parce que les deux expressions fonctionnent directement et en fait beaucoup d'autres supposent la citation ou le besoin de double échapper pour éviter une interprétation secondaire par le shell comme triviale. Je ne peux plus modifier le commentaire (limite de 5 minutes). Mon commentaire aurait pu être meilleur: "ceci, s'il est combiné avec le commentaire de @tripleee, c'est la réponse la plus complète. Parce que les deux commandes fonctionnent immédiatement et avec le guillemet c'est complet"
jringoot

1
Ce que je recommande généralement, c'est "toujours des expressions régulières entre guillemets simples". Ce n'est pas «complet» mais cela fait le travail et implique que vous devez soit comprendre la citation ou vivre selon cette règle simple.
tripleee

4

Point d'échappement. Exemple de commande sera.

grep '0\.00'

4

Vous pouvez échapper le point et les autres caractères spéciaux en utilisant \

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


Un rappel au futur lecteur, \.entouré de citations est nécessaire pour le faire fonctionner.
Fruit

1

Vous pouvez également rechercher avec l'option - qui ignore fondamentalement tous les caractères spéciaux et ne sera pas interprétée par grep.

$ cat foo |grep -- "0\.49"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.