comportement des espaces blancs de grep regex

87

J'ai un fichier texte, contenant quelque chose comme:

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 m'expliquer, pourquoi je ne peux pas utiliser \smais \s*et \s[E]correspondre?

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

Milde
la source

Réponses:

122

Cela ressemble à une différence de comportement dans la gestion \sentre grep 2.5 et les versions plus récentes (un bogue dans l'ancien grep?). Je confirme votre résultat avec grep 2.5.4, mais tous les quatre de vos greps fonctionnent lorsque 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 cela \sn'est pas documenté):

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

Mon conseil est d'éviter d'utiliser \s... utiliser [ \t]*ou [[:space:]]ou quelque chose comme ça à la place.

Kamal
la source
24
Ou juste [:space:], par exemple. comme ceci:cat file | grep "[[:space:]]"
Kiril Kirov
cela semble être un bogue dans la nouvelle version de grep (autre point de vue) selon cette requête de bogue mail-archive.com/[email protected]/msg02686.html mais pourquoi la dernière déclaration correspond-elle?
Milde
1
@Milde, notez le post de suivi mail-archive.com/[email protected]/msg02689.html où ce rapport de bogue a été marqué comme invalide et fermé (donc ce n'est pas considéré comme un bogue dans le nouveau grep).
Kamal
2
@Milde, aucune de la documentation grep que j'ai examinée (ancienne ou nouvelle) ne fait référence du \stout. Je dirais que son comportement est "indéfini". Utilisez plutôt [: space:], qui fonctionne comme documenté dans l'ancien et le nouveau grep.
Kamal
merci, je vais utiliser [: space:] à l'avenir pour éviter le problème
Milde