É 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.