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!
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
".
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