operador grep +

0

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.

Trismegistos
fonte
2
O +quantificador deve ser escrito como \+em BRE. Então, grep 'a.\+b'ou grep -E 'a.+b'.
manatwork

Respostas:

2

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 -Eopção


fonte
4

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 .

The Spooniest
fonte
11
O GNU grep -Esuporta referências anteriores que você pode verificar echo aa | grep -E '(.)\1'.
Stéphane Chazelas