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?
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:
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
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
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:
-e
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.
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.
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.