Problema regex Grep 'OR'


65

Sto cercando di usare grep con un regex per trovare le righe in un file che corrispondono a 1 di 2 stringhe possibili. Ecco il mio grep:

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

Il grep sopra non restituisce risultati. Tuttavia, se eseguo uno dei due:

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

o

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

Faccio corrispondere a linee specifiche. Perché il mio regex OR non corrisponde? Grazie in anticipo per l'aiuto!

Risposte:


94

Con regex normale, i personaggi (, |e )bisogno di essere sfuggito. Quindi dovresti usare

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

Non hai bisogno delle escape quando usi l' opzione regex estesa ( -E). Vedi man grep, sezione " Basic vs Extended Regular Expressions".


10
Puoi anche usare al egrepposto di grep -E.
Riccardo Murri,

2
@RiccardoMurri La risposta di Michal afferma che egrep (e fgrep) sono deprecati (anche se potrebbero ancora funzionare).
Timo,

27

Se vuoi usare più rami (il |come or), quindi per essere più compatibile, è meglio dire esplicitamente che vuoi usare "RE moderno" aka. ERE.

Per fare ciò, usa grep -E :

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

Per saperne di più su RE, ERE e l'intera storia "moderna" di ER vedi man 7 regex.

In alternativa puoi usare egrepinvece di grep, ma come puoi leggere da man grep:

egrep è uguale a grep -E. fgrep è uguale a grep -F

(...)

L'invocazione diretta come egrep o fgrep è obsoleta


Mentre l'invocazione diretta di egrep è deprecata, funzionerà nella maggior parte delle varianti * nix.
Segna D il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.