Grep 'OU' problema de regex

54

Estou tentando usar o grep com um regex para localizar linhas em um arquivo que corresponde a 1 de 2 cadeias possíveis. Aqui está o meu grep:

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

O grep acima não retorna nenhum resultado. No entanto, se eu executar:

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

ou

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

Eu correspondo linhas específicas. Por que minha regex OR não está combinando? Agradecemos antecipadamente pela ajuda!

    
por dr.bunsen 30.09.2011 / 14:57

2 respostas

79

Com o regex normal, os caracteres ( , | e ) precisam ser escapados. Então você deve usar

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

Você não precisa das fugas quando usa a opção regex estendida ( -E ). Veja man grep , seção " Basic vs Extended Regular Expressions ".

    
por 30.09.2011 / 15:05
25

Se você quiser usar várias ramificações (o | como or ), então, para ser mais compatível, é melhor dizer explicitamente que você deseja usar "modern RE" aka. ERE.

Para fazer isso, use grep -E :

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

Para saber mais sobre RE, ERE e toda a história do ER "moderno", consulte man 7 regex .

Como alternativa, você pode usar egrep em vez de grep , mas como pode ler em man grep :

egrep is the same as grep -E. fgrep is the same as grep -F

(...)

Direct invocation as either egrep or fgrep is deprecated

    
por 30.09.2011 / 15:19