web-dev-qa-db-fra.com

Comment utiliser l'expression régulière OR dans grep dans Cygwin?

Je dois renvoyer les résultats de deux correspondances différentes à partir d'un seul fichier.

grep "string1" my.file

renvoie correctement l'instance unique de string1 dans mon.fichier

grep "string2" my.file

renvoie correctement l'instance unique de string2 dans mon.fichier

mais

grep "string1|string2" my.file

ne renvoie rien

dans les applications de test regex, cette syntaxe est correcte, alors pourquoi ne fonctionne-t-elle pas pour grep dans cygwin?

52
rob

En utilisant le | sans l'échapper dans une expression régulière de base ne correspondra qu'au | littéral. Par exemple, si vous avez un fichier avec un contenu

string1
string2
string1|string2

En utilisant grep "string1|string2" my.file ne correspondra qu'à la dernière ligne

$ grep "string1|string2" my.file
string1|string2

Pour utiliser l'opérateur d'alternance |, vous pourriez:

  1. Utilisez une expression régulière de base (juste grep) et échappez à | caractère dans l'expression régulière

    grep "string1\|string2" my.file

  2. Utilisez une expression régulière étendue avec egrep ou grep -E, comme Julian l'a déjà souligné dans sa réponse

    grep -E "string1|string2" my.file

  3. Si vous voulez faire correspondre deux modèles différents, vous pouvez également les spécifier séparément dans -e options:

    grep -e "string1" -e "string2" my.file

Vous trouverez peut-être les sections suivantes de la référence grep utiles:

77
Xavi López

Vous devrez peut-être utiliser egrep ou grep -E. Le tube OR fait partie du grep "étendu" et peut ne pas être pris en charge par le grep Cygwin de base.

En outre, vous devez probablement échapper au symbole de la pipe.

10
Julian

La manière la meilleure et la plus claire que j'ai trouvée est: grep -e REG1 -e REG2 -e REG _FILETOGREP_

Je n'utilise jamais de pipe car c'est moins évident et très gênant de se mettre au travail.

6
Travis

Vous pouvez trouver ces informations en lisant le manuel fin: grep (1), que vous pouvez trouver en exécutant 'man grep'. Il décrit la différence entre grep et egrep, et les expressions de base et régulières, ainsi que de nombreuses autres informations utiles sur grep.

0
Andrew Schulman