Comportamento do grep -o no OSX

6

No Linux, quando eu faço echo foo | grep -o '^.' para obter o primeiro caractere, ele imprime f conforme o esperado. (Eu sei, | cut -c1 provavelmente seria mais rápido.)

Mas no OSX, fazendo os mesmos resultados em 3 correspondências (3 linhas):

f
o
o

WTF? Mesmo sem a opção -o , a cor da saída (no meu ambiente) informa que a linha inteira corresponde, em vez de apenas o primeiro caractere.

Alguém por favor pode me esclarecer?

    
por Patrik 16.01.2016 / 02:49

1 resposta

5

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

    
por 16.01.2016 / 03:52

Tags