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 .