Tudo depende de quais flags você passa para o grep.
O grep flagless normal (que é o mesmo que passar -G) usa "Expressões regulares básicas":
-G, --basic-regexp
Interpret PATTERN as a basic regular expression (BRE, see
below). This is the default.
Se você especificar -E, ele usa expressões regulares "Estendidas":
-E, --extended-regexp
Interpret PATTERN as an extended regular expression (ERE,
see below). (-E is specified by POSIX.)
E então você tem -P para expressões regulares Perl (PCRE):
-P, --perl-regexp
Interpret PATTERN as a Perl regular expression. This is highly
experimental and grep -P may warn of unimplemented features.
Expressões regulares estendidas versus básicas
Em expressões regulares básicas, os meta-caracteres?, +, {, |, (e) perdem seu significado especial; Em vez disso, use as versões invertidas \ ?, +, {, \ |, (e).
O egrep tradicional não suportava o {meta-caractere, e algumas implementações egrep suportam {em vez disso, os scripts portáveis devem evitar {em padrões grep -E e devem usar [{] para corresponder a um literal {.
GNU grep -E tenta suportar o uso tradicional supondo que {não é especial se for o início de uma especificação de intervalo inválido. Por exemplo, o comando grep -E '{1' procura pela cadeia de dois caracteres {1 em vez de relatar um erro de sintaxe na expressão regular. O POSIX.2 permite este comportamento como uma extensão, mas os scripts portáteis devem evitá-lo.
Assim, embora o grep se esforce para ser o mais próximo possível do POSIX, ainda existem algumas falhas nele.