Regex para "ou" de várias palavras em grep

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

Eu entendo que o comando acima deve retornar cada linha no nome do arquivo onde existe "foo" ou "bar". As páginas de manual confirmam | como o Regex ou símbolo e o código funciona para "foo" e "bar" independentemente. o que estou perdendo?

Ocasta Eshu
fonte

Respostas:

21

O grep usa expressões regulares básicas (BRE) por padrão. Na página do manual:

Expressões regulares básicas vs. estendidas: nas expressões regulares básicas, os meta-caracteres?, +, {, |, (, E) perdem seu significado especial; em vez disso, use as versões com barra invertida \ ?, +, {, \ |, (, e).

Então você precisa escapar do |:

grep "foo\|bar" filename 

ou ativar expressões regulares estendidas:

grep -E "foo|bar" filename
jhenninger
fonte
Eu vi isso na página de manual e entendi mal. Eu pensei que isso significava que \ | faria com que ela procurasse a expressão completa "foo | bar" em oposição às expressões individuais. Obrigado pela resposta rápida!
Ocasta Exu
4
Você também pode usar egrep(um alias para grep -E) em vez de grep.
Speakr