Comportement de grep -o sur OSX

Sur Linux, quand je fais echo foo | grep -o '^.' echo foo | grep -o '^.' pour get le premier caractère, il affiche f comme prévu. (Je sais, | cut -c1 serait probablement plus rapide.)

Mais sur OSX, faire les mêmes résultats en 3 matchs (3 lignes):

 f o o 

WTF? Même sans l'option -o , la couleur de la sortie (dans mon environnement) me dit que toute la ligne correspond, au lieu de juste le premier caractère.

Quelqu'un peut-il m'éclairer?

C'est un comportement intéressant que vous avez remarqué là-bas.

Il est incorrect de le classr comme un "bug" car POSIX ne spécifie pas d'option -o pour grep . Vous n'aimez peut-être pas comment cela se comporte, et je suis d'accord qu'il est ennuyeux que BSD et GNU grep diffèrent, mais ce comportement n'est pas en conflit avec ce que disent les pages du manuel BSD. Si tu dis toujours que c'est un bug, eh bien, tu sais, c'est comme ton opinion , mec . 🙂

Peut-être que cette présentation alternative vous montrera pourquoi elle se comporte comme elle:

 $ echo foofoofoo | grep -o foo foo foo foo 

Autrement dit, le grep BSD et le grep GNU montrent toutes les parties correspondantes de la ligne, pas seulement la première. La différence est que BSD grep semble implémenter cela en consommant la partie appariée, puis en l'appariant à nouveau. Quand il supprime le f principal dans votre exemple, il trouve que le o qui le suit correspond aussi, comme le suivant.

Une solution pour cela est d'installer Homebrew , puis dites brew install grep . Cela vous donnera GNU grep comme ggrep , donc il ne rentre pas en collision avec la version stock. GNU grep donnera le même comportement sur mon exemple ci-dessus, mais les deux diffèrent pour cela:

  $ echo foofoofoo | ggrep -o ^foo foo 

BSD grep va imprimer trois foo .

Si vous remplacez la version stock par un lien symbolique à ggrep , prenez garde que certaines mises à jour du operating system le replaceont.