Quale standard di espressione regolare viene utilizzato in grep?


0

È lo standard di espressione regolare utilizzato in grep POSIX + ASCII o qualcos'altro è mescolato?

Risposte:


3

Tutto dipende da quali bandiere si passa a grep.

Il normale grep senza bandiera (che equivale al passaggio -G) utilizza "Espressioni regolari di base":

-G, --basic-regexp
    Interpret PATTERN as a basic regular expression (BRE, see 
    below).  This is the default.

Se si specifica -E utilizza espressioni regolari "Estese":

-E, --extended-regexp
    Interpret PATTERN as an extended regular expression (ERE, 
    see below).  (-E is specified by POSIX.)

E poi hai -P per le espressioni regolari Perl (PCRE):

-P, --perl-regexp
    Interpret PATTERN as a Perl regular expression.  This is highly 
    experimental and grep -P may warn  of  unimplemented features.

Espressioni regolari di base vs estese

Nelle espressioni regolari di base i meta-caratteri?, +, {, |, (E) perdono il loro significato speciale; usa invece le versioni backslash \ ?, +, {, \ |, (, e).

L'egrep tradizionale non supportava il {meta-character, e qualche supporto per implementazioni di egrep {invece, quindi gli script portatili dovrebbero evitare {in grep -E patterns e dovrebbero usare [{] per trovare un valore letterale {.

GNU grep -E tenta di supportare l'utilizzo tradizionale assumendo che {non sia speciale se sarebbe l'inizio di una specifica intervallo non valida. Ad esempio, il comando grep -E '{1' cerca la stringa di due caratteri {1 invece di riportare un errore di sintassi nell'espressione regolare. POSIX.2 consente questo comportamento come estensione, ma gli script portatili dovrebbero evitarlo.

Quindi anche se grep si sforza di essere il più vicino possibile a POSIX, ci sono ancora alcuni difetti in esso.


Sì, lo dico ma non dice quale standard è effettivamente utilizzato, e se è un mix di roba allora non c'è referenza allo standard misto. Quindi, fondamentalmente, sappiamo che funziona con qualcosa ma non so con cosa esattamente. : D
Denys S.

@den: le espressioni regolari POSIX sono spiegate in regex (7) , Perl's - perlre .
grawity

Si tratta di Linux, ma l'opzione "-P" non è disponibile in MinGW ("grep: il supporto per l'opzione -P non è compilato in questo --disable-perl-regexp binario"), almeno non per impostazione predefinita.
Peter Mortensen

Diverso grep s capire (leggermente) diversi RE (e flag, e ...)
vonbrand

@PeterMortensen, GnuWin32 supporta grep -P, Non sono sicuro che questo aiuti. Anche Cygwin Grep fa così, afaik
Sebastian Godelet
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.