Muito do que consideramos "expressões regulares" é na verdade chamado Expressões regulares estendidas (ou EREs) no POSIX. Mas sua grepchamada parece estar no modo Expressão regular básica (ou BRE, para abreviar). BREs e EREs têm várias diferenças. Uma dessas diferenças é que você precisa escapar dos metacaracteres: +é um sinal de mais literal, a menos que você escape com uma barra invertida. Seu grepcomando parece estar no modo BRE, então tente usar em \+vez de uma planície +.
Se você está sendo realmente rigoroso sobre BRE versus ERE, os BREs não suportam as operações +e ?, embora você possa simulá-los com \{1,\}e \{0,1\}construções, respectivamente. BREs estritos também não suportam o |operador e não sei como você simula isso em um BRE. No entanto, diferentemente dos EREs, os BREs suportam referências anteriores (que se parecem muito com o Perl, exceto que você precisa escapar dos parênteses).
Algumas grepimplementações (como o GNU) apoiar os ?, +e |operadores em modo BRE, embora você tem que escapar deles como quaisquer outros metacaracteres: \?, \+, e \|. Mas não há grepimplementações que eu conheço que suportem referência traseira no modo ERE.
Para forçar o grepuso do modo ERE, você pode usar a -Eopção grepou, em egrepvez disso, chamá-lo .
+quantificador deve ser escrito como\+em BRE. Então,grep 'a.\+b'ougrep -E 'a.+b'.