Risposte:
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.
grep
s capire (leggermente) diversi RE (e flag, e ...)
grep -P
, Non sono sicuro che questo aiuti. Anche Cygwin Grep fa così, afaik