Muito do que pensamos como "expressões regulares" é na verdade chamado Expressões Regulares Estendidas (ou EREs) no POSIX. Mas a sua chamada grep
parece estar no modo Expressão Regular Básica (ou BRE, abreviadamente). BREs e EREs têm várias diferenças. Uma dessas diferenças é que você precisa escapar de metacaracteres: +
é um sinal de mais literal, a menos que você escape com uma barra invertida. Seu comando grep
parece estar no modo BRE, então tente usar \+
em vez de +
.
Se você for realmente rigoroso sobre o BRE e o ERE, o BREs não suportará as operações +
e ?
, embora você possa simulá-las com as construções \{1,\}
e \{0,1\}
, respectivamente. BREs restritos também não suportam o operador |
, e não sei como você simula isso em um BRE. No entanto, ao contrário dos EREs, os BREs suportam referências anteriores (que se parecem muito com o Perl, exceto pelo fato de você ter que escapar dos parênteses).
Algumas implementações de grep
(como o GNU) suportam os operadores ?
, +
e |
no modo BRE, embora você tenha que escapar deles como qualquer outro metacaractere: \?
, \+
, e \|
. Mas não há grep
implementações que eu saiba que suportam backreferencing no modo ERE.
Para forçar o grep
a usar o modo ERE, você pode usar a opção -E
para grep
ou pode chamá-lo como egrep
.