grep “+” o operador não funciona

23

Isso

ls -l /var/log | awk '{print }' | grep "^[a-z]*\.log."

mostra isso:

alternatives.log.1
alternatives.log.10.gz
alternatives.log.2.gz
alternatives.log.3.gz
alternatives.log.4.gz
alternatives.log.5.gz
alternatives.log.6.gz
alternatives.log.7.gz
alternatives.log.8.gz
alternatives.log.9.gz
apport.log.1
apport.log.2.gz
apport.log.3.gz

mas isto:

ls -l /var/log | awk '{print }' | grep "^[a-z]+\.log."

não produz nada.

Por quê? Acabei de alterar * para + . Não é semelhante? O operador + precisa de pelo menos uma correspondência e * zero ou mais.

    
por Marko 09.05.2013 / 19:51

2 respostas

27

Isso ocorre porque grep (sem nenhum argumento) funciona apenas com expressões regulares padrão. + faz parte das expressões regulares estendidas, portanto, para usar isso, você precisa usar grep -E ou egrep :

ls -l /var/log | awk '{print }' | grep -E "^[a-z]+\.log."

Além disso, você pode fazer isso apenas se não quiser usar expressões regulares estendidas:

ls -l /var/log | awk '{print }' | grep "^[a-z][a-z]*\.log."
    
por MiJyn 09.05.2013 / 19:55
8

Para elaborar a resposta MiJyns, "caracteres especiais" como + funcionam na regex padrão também, mas você precisa escapar deles com uma barra invertida. Você pode dizer que as expectativas padrão são invertidas entre a regex padrão e estendida:

Na regex padrão, os caracteres correspondem literalmente por padrão. Por exemplo, em grep "ab+" , o + é um literal +. O regex, por exemplo, encontraria "ab + ab", mas não "abbbb". Para usar o "significado especial" de +, você precisa escapar. Então, grep "ab\+" encontraria "abbb", mas não "ab + ab" por mais tempo. Porque no último exemplo, o + é interpretado como o quantificador "um ou muitos dos que", nesse caso "um ou muitos b".

Em regex estendido, é exatamente o contrário. Aqui, você precisa escapar de "caracteres especiais" para serem tratados literalmente. Então, grep -E "ab+" encontra "abbb", mas não "ab + ab". Se você escapar do +, ele é correspondido literalmente. Então, grep -E "ab\+" encontra "ab + ab", mas não "abbb".

    
por Henning Kockerbeck 22.05.2013 / 11:25

Tags