web-dev-qa-db-fra.com

Comportement des espaces blancs avec les expressions rationnelles grep

J'ai un fichier texte contenant quelque chose comme:

12,34 EUR 
 5,67 EUR
 ...

Il y a un espace blanc 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 m'expliquer, pourquoi je ne peux pas utiliser \s mais \s* et \s[E] apparié?

Système d'exploitation: Ubuntu 10.04, grep v2.5

74
Milde

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

Remarque:

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

tandis que

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

Probablement moins de problèmes (comme \s n'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 comme ça à la place.

100
Kamal