2010-08-26 11 views
3

Quelqu'un peut-il expliquer pourquoi ce code ne fonctionne pas comme prévu? Je ne m'attendrais pas à ce qu'il corresponde au premier caractère, mais avec des caractères littéraux, mais les caractères génériques (.) Et caractères se comportent étrangement:grep: "^." ne correspond pas correctement

J'utilise -o juste pour montrer exactement comment les objets correspondent, il ne fait pas Ne changez pas ce qui correspond du tout.

$ echo foo | grep -o '^.' 
f 
o 
o 

Certains comportements plus inattendus:

$ echo foobarbazquux | grep -o '^[foarqux]' 
f 
o 
o 

$ echo foobarbazquux | grep -o '^.[^u]' 
fo 
ob 
ar 
ba 
zq 

esentially le matcher début de ligne (^) ne se comporte pas comme prévu dans ces cas. Y at-il un moyen de le faire se comporter plus normalement?

+0

Est-ce que ça marche vraiment mal si vous n'utilisez pas -o? Ma conjecture est que -o sortie peut être produite avant d'appliquer des ancres. – ninjalj

+2

Je vois exactement le même comportement avec GNU grep 2.5.1. C'est comme si grep recommençait la recherche après chaque match. Un autre cas de test: 'echo foobarfoo | egrep -o 'foo |^bar'' affiche 'foo',' bar', 'foo'. –

+0

Pour ce que ça vaut, je pourrais reproduire ce comportement sur mon terminal OSX avec grep 2.5.1. Encore plus mystérieusement, '$' fonctionne comme prévu - mais pas '^'. –

Répondre

0

De ma boîte Ubuntu 10.04:

[email protected]:~$ echo foo | grep -o '^.' 
f 
[email protected]:~$ echo foobarbazquux | grep -o '^[foarqux]' 
f 
[email protected]:~$ echo foobarbazquux | grep -o '^.[^u]' 
fo 
[email protected]:~$ grep --version 
GNU grep 2.5.4 

Il existe une série de variables d'environnement grep cherchera à contrôler son comportement/sortie, afin de vérifier si l'un de ceux qui sont définis. Très probablement, vous avez défini "GREP_OPTIONS".

+0

2.5.1 ici, se comporte comme bukzor, voir mon commentaire à la question. – ninjalj

+0

J'ai le même comportement que OP même si j'utilise 'env -i' pour effacer l'environnement. –

Questions connexes