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?

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.