web-dev-qa-db-fra.com

Grep n'est pas une expression régulière

Je dois rechercher une variable PHP _ $someVar. Cependant, Grep pense que j'essaie d'exécuter une expression régulière et se plaint:

$ grep -ir "Something Here" * | grep $someVar
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
$ grep -ir "Something Here" * | grep "$someVar"
<<Here it returns all rows with "someVar", not only those with "$someVar">>

Je ne vois pas d'option pour dire à grep not d'interpréter la chaîne comme une expression régulière, mais d'inclure le $ comme juste un autre caractère de chaîne.

72
dotancohen

Échapper au $ en mettant un \ devant.

0
Mr Lister

Utilisez fgrep (obsolète), grep -F ou grep --fixed-strings, pour qu'il traite le modèle comme une liste de chaînes fixes, au lieu d'une expression régulière.

Pour référence, la documentation mentionne (extraits):

-F--fixed-strings Interpréter le modèle comme une liste de chaînes fixes (au lieu d'expressions régulières), séparées par des retours à la ligne, dont chacune doit être mise en correspondance. (-F est spécifié par POSIX.)

fgrep est identique à grep -F. L'invocation directe en tant que fgrep est déconseillée, mais est fournie pour permettre aux applications historiques qui en dépendent de s'exécuter sans modification.

Pour la référence complète, vérifiez: https://www.gnu.org/savannah-checkouts/gnu/grep/manual/grep.html

252
Hasturkun

grep -F est un moyen standard de dire à grep d'interpréter l'argument comme une chaîne fixe, pas un modèle.

52
rkhayrov

Vous devez dire à grep que vous utilisez une chaîne fixe, au lieu d'un modèle, en utilisant '-F':

grep -ir "Something Here" * | grep -F \$somevar
8
huelbois

+1 pour le -F option, ce sera la réponse acceptée. De plus, j'ai eu un comportement "étrange" lors de la recherche du -I.. modèle dans mes fichiers, comme -I était considéré comme une option de grep; pour éviter ce genre d'erreurs, nous pouvons explicitement spécifier la fin des arguments de la commande en utilisant --.

Exemple:

grep -HnrF -- <pattern> <files>

J'espère que cela aidera quelqu'un.

1
Aloïké Go

Dans cette question, le principal problème ne concerne pas grep l'interprétation $ comme expression régulière. Il s'agit du Shell remplaçant $someVar avec la valeur de la variable d'environnement someVar, probablement la chaîne vide.

Donc, dans le premier exemple, c'est comme appeler grep sans aucun argument, et c'est pourquoi cela vous donne une sortie usage. Le deuxième exemple ne doit pas renvoyer toutes les lignes contenant someVar mais toutes les lignes, car la chaîne vide se trouve dans toutes les lignes.

Pour dire au Shell de ne pas se substituer, vous devez utiliser '$someVar' ou \$someVar. Ensuite, vous devrez faire face à l'interprétation grep du $, d'où le grep -F option donnée dans de nombreuses autres réponses.

Une réponse valable serait donc:

grep -ir "Something Here" * | grep '$someVar'