Problema de expresión regular de Grep 'OR'

65

Estoy tratando de usar grep con una expresión regular para encontrar líneas en un archivo que coincidan con 1 de 2 cadenas posibles. Aquí está mi grep:

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

El grep anterior no devuelve resultados. Sin embargo, si ejecuto cualquiera de los dos:

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

o

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

Yo coincido con líneas específicas. ¿Por qué mi OR regex no coincide? Gracias de antemano por la ayuda!

Dr. Bunsen
fuente

Respuestas:

94

Con regex normal, los caracteres (, |y )necesitan ser escapados. Entonces deberías usar

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

No necesita los escapes cuando usa la opción extendida regex ( -E). Ver man grepsección " Basic vs Extended Regular Expressions".

rozcietrzewiacz
fuente
10
También puede usar en egreplugar de grep -E.
Riccardo Murri
2
@RiccardoMurri La respuesta de Michal afirma que egrep (y fgrep) están en desuso (aunque aún podrían funcionar).
Timo
27

Si desea usar varias ramas (el |as or), para ser más compatible, es mejor decir explícitamente que quiere usar "RE moderno" alias. ANTES DE.

Para hacerlo, use grep -E :

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

Para obtener más información sobre RE, ERE y toda la historia "moderna" de ER, vea man 7 regex.

Alternativamente, puede usar en egreplugar de grep, pero como puede leer en man grep:

egrep es lo mismo que grep -E. fgrep es lo mismo que grep -F

(...)

La invocación directa como egrep o fgrep está en desuso

Michał Šrajer
fuente
Si bien la invocación directa de egrep está en desuso, funcionará en la mayoría de las variantes * nix.
Mark D