2010-11-20 27 views
53

J'ai un fichier texte, contenant quelque chose comme:grep regex comportement des espaces

12,34 EUR 
5,67 EUR 
... 

Il y a un espace avant 'EUR et j'ignore 0, XX EUR.

J'ai essayé:

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 !

Quelqu'un peut-il me expliquer pls, pourquoi je ne peux pas utiliser \s mais \s* et \s[E] apparié?

OS: Ubuntu 10.04, grep v2.5

Répondre

78

Cela ressemble à une différence de comportement dans la gestion des \s entre les versions 2.5 et grep plus récentes (un bug dans le vieux grep?). Je confirme votre résultat avec grep 2.5.4, mais tous les quatre de vos greps fonctionnent quand vous utilisez grep 2.6.3 (Ubuntu 10.10).

Note:

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

alors

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

Probablement moins de problèmes (comme \s est pas documenté):

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

Mon conseil est d'éviter d'utiliser \s ... utilisation [ \t]* ou [:space:] ou quelque chose Je l'aime plutôt.

+19

Ou juste '[: space:]', par ex. comme ceci: 'fichier de chat | grep "[[: space:]]" ' –

+0

cela semble être un bug dans la nouvelle version de grep (autre point de vue) selon cette demande de bug http://www.mail-archive.com/bug-grep @ gnu.org/msg02686.html mais pourquoi la dernière instruction correspond-elle? – Milde

+0

@Milde, notez le post de suivi http://www.mail-archive.com/[email protected]/msg02689.html où ce rapport de bug a été marqué invalide et fermé (donc ce n'est pas considéré comme un bug) dans grep plus récent). – Kamal