De acordo com o manual grep:
* The preceding item will be matched zero or more times.
+ The preceding item will be matched one or more times.
Vamos testar
echo 'agb' | grep 'a.*b' # returns agb
echo 'agb' | grep 'a.+b' # returns nothing
Por que + não corresponde a três gs? De acordo com o meu conhecimento, 3 é mais que 1.
grep
regular-expression
Trismegistos
fonte
fonte
+
quantificador deve ser escrito como\+
em BRE. Então,grep 'a.\+b'
ougrep -E 'a.+b'
.Respostas:
Qualquer manual grep que você esteja lendo também deve ter uma seção explicando os diferentes tipos de expressões regulares (básica e estendida). o
+
operador não está disponível no básico, apenas estendido. Para usar expressões regulares estendidas, você precisa da-E
opçãofonte
Muito do que consideramos "expressões regulares" é na verdade chamado Expressões regulares estendidas (ou EREs) no POSIX. Mas sua
grep
chamada 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. Seugrep
comando 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
grep
implementaçõ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ágrep
implementações que eu conheço que suportem referência traseira no modo ERE.Para forçar o
grep
uso do modo ERE, você pode usar a-E
opçãogrep
ou, emegrep
vez disso, chamá-lo .fonte
grep -E
suporta referências anteriores que você pode verificarecho aa | grep -E '(.)\1'
.