web-dev-qa-db-fra.com

Problème de regex grep 'OR'

J'essaie d'utiliser grep avec une expression régulière pour trouver des lignes dans un fichier qui correspondent à 1 des 2 chaînes possibles. Voici mon grep:

$ grep "^ID.*(ETS|FBS)" my_file.txt

Le grep ci-dessus ne renvoie aucun résultat. Cependant si j'exécute soit:

$ grep "^ID.*ETS" my_file.txt  

ou

$ grep "^ID.*FBS" my_file.txt  

Je fais correspondre des lignes spécifiques. Pourquoi mon OR regex ne correspond pas? Merci d'avance pour l'aide!

69
dr.bunsen

Avec l'expression régulière, les caractères (, | et ) doit être échappé. Vous devez donc utiliser

$ grep "^ID.*\(ETS\|FBS\)" my_file.txt

Vous n'avez pas besoin des échappements lorsque vous utilisez le regex étend (-E)option. Voir man grep, section "Basic vs Extended Regular Expressions ".

98
rozcietrzewiacz

Si vous souhaitez utiliser plusieurs branches (le | as or), alors pour être plus compatible, il vaut mieux dire explicitement que vous voulez utiliser "modern RE" aka. AVANT.

Pour ce faire, utilisez grep -E:

grep -E "^ID.*(ETS|FBS)" my_file.txt

Pour en savoir plus sur RE, ERE et toute l'histoire des ER "modernes", voir man 7 regex.

Vous pouvez également utiliser egrep au lieu de grep, mais comme vous pouvez le lire à partir de man grep:

egrep est identique à grep -E. fgrep est identique à grep -F

(...)

L'invocation directe comme egrep ou fgrep est obsolète

27
Michał Šrajer