comportamento de espaços em branco grep regex


87

Eu tenho um arquivo de texto contendo algo como:

12,34 EUR 
 5,67 EUR
 ...

Há um espaço em branco antes de 'EUR' e eu ignoro 0, XX EUR.

Eu tentei:

grep '[1-9][0-9]*,[0-9]\{2\}\sEUR' => didn't match !

grep '[1-9][0-9]*,[0-9]\{2\} EUR' => worked !

grep '[1-9][0-9]*,[0-9]\{2\}\s*EUR' => worked !

grep '[1-9][0-9]*,[0-9]\{2\}\s[E]UR' => worked !

Alguém pode me explicar, por que não posso usar, \smas \s*e \s[E]combinou?

SO: Ubuntu 10.04, grep v2.5

Respostas:


122

Isso parece uma diferença de comportamento no manuseio do \sgrep 2.5 e versões mais recentes (um bug no grep antigo?). Eu confirmo seu resultado com grep 2.5.4, mas todos os quatro de seus greps funcionam ao usar grep 2.6.3 (Ubuntu 10.10).

Nota:

GNU grep 2.5.4
echo "foo bar" | grep "\s"
   (doesn't match)

enquanto que

GNU grep 2.6.3
echo "foo bar" | grep "\s"
foo bar

Provavelmente menos problemas (como \snão está documentado):

Both GNU greps
echo "foo bar" | grep "[[:space:]]"
foo bar

Meu conselho é evitar usar \s... use [ \t]*ou [[:space:]]ou algo parecido em vez disso.


24
Ou apenas [:space:], por ex. assim:cat file | grep "[[:space:]]"
Kiril Kirov

parece ser um bug na versão mais recente do grep (outro ponto de vista) de acordo com esta solicitação de bug mail-archive.com/bug-grep@gnu.org/msg02686.html, mas por que a última instrução corresponde?
Milde de

1
@Milde, observe a postagem de acompanhamento mail-archive.com/bug-grep@gnu.org/msg02689.html onde o relatório de bug foi marcado como inválido e fechado (portanto, não é considerado um bug no grep mais recente).
Kamal

2
@Milde, nenhuma documentação do grep que examinei (antiga ou nova) realmente faz referência \s. Eu diria que seu comportamento é "indefinido". Use [: espaço:] ao invés, que funciona conforme documentado no grep antigo e no novo.
Kamal

obrigado, usarei [: espaço:] no futuro para evitar o problema
Milde
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.