grep + operador

0

De acordo com o manual do grep:

  * The preceding item will be matched zero or more times.
  + The preceding item will be matched one or more times.

Vamos testá-lo

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 meu conhecimento, 3 é mais que 1.

    
por Trismegistos 23.09.2013 / 16:18

2 respostas

2

Qualquer manual que você esteja lendo também deve ter uma seção explicando os diferentes tipos de expressões regulares (básicas e estendidas). o operador + não está disponível no básico, apenas estendido. Para usar expressões regulares estendidas, você precisa da opção -E .

    
por 23.09.2013 / 16:24
4

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 .

    
por 23.09.2013 / 16:54