Regex pour «ou» de plusieurs mots dans grep

12
[Computer]$ grep "foo|bar" filename

Je comprends que la commande ci-dessus doit retourner chaque ligne dans le nom de fichier où il y a "foo" ou "bar". Les pages de manuel le confirment | comme Regex ou symbole et le code fonctionne pour "foo" et "bar" indépendamment. Qu'est-ce que je rate?

Ocasta Eshu
la source

Réponses:

21

grep utilise des expressions régulières de base (BRE) par défaut. Depuis la page de manuel:

Expressions régulières de base et étendues: dans les expressions régulières de base, les méta-caractères?, +, {, |, (Et) perdent leur signification spéciale; utilisez plutôt les versions avec barre oblique inversée \ ?, +, {, \ |, (et).

Vous devez donc soit échapper au |:

grep "foo\|bar" filename 

ou activez les expressions régulières étendues:

grep -E "foo|bar" filename
jhenninger
la source
J'ai vu cela dans la page de manuel et j'ai mal compris. Je pensais que cela signifiait que \ | le ferait rechercher l'expression complète "foo | bar" par opposition aux expressions individuelles. Merci pour la réponse rapide!
Ocasta Eshu
4
Vous pouvez également utiliser egrep(un alias pour grep -E) au lieu de grep.
speakr