É um comportamento interessante que você notou lá.
É errado classificá-lo como um "bug" porque POSIX não especifica a opção -o para grep . Você pode não gostar de como ele se comporta, e eu concordarei que é irritante que o BSD e o GNU grep sejam diferentes, mas esse comportamento não está realmente em conflito com o que as páginas de manual do BSD dizem. Se você ainda diz que é um bug, bem, você sabe, é como, seu opinião , homem . :)
Talvez esta apresentação alternativa mostre por que ela se comporta da seguinte forma:
$ echo foofoofoo | grep -o foo
foo
foo
foo
Ou seja, tanto o BSD grep quanto o GNU grep mostram todos as partes correspondentes da linha, não apenas a primeira. A diferença é que o BSD grep parece estar implementando isso consumindo a parte correspondente e, em seguida, combinando novamente. Quando ele remove o f inicial em seu exemplo, ele descobre que o o seguinte também coincide com o seguinte.
Uma correção para isso é instalar o Homebrew e, em seguida, dizer brew install grep . Isso fará com que você seja GNU grep as ggrep , por isso não colide com a versão de estoque. O% GNUgrep dará o mesmo comportamento no meu exemplo acima, mas os dois diferem para isso:
$ echo foofoofoo | ggrep -o ^foo
foo
O BSD grep imprimirá três foo s.
Se você substituir a versão de estoque por um link simbólico para ggrep , tenha cuidado com o fato de que algumas atualizações de sistema operacional o substituirão.