Meu computador está executando o macOS 10.12.3 e estou usando o grep
utilitário instalado pelo sistema com a versão 2.5.1-FreeBSD.
Estas são as saídas que recebo ao testar várias regexes:
Mas se eu os executar usando o GNU grep (versão 2.25), obtenho o seguinte:
O grep do GNU parece correto para mim e o BSD está incorreto, não? Por que eles diferem? Não entendo por que o grep do BSD corresponde ao "a" quando o regex especifica que deve seguir o início da linha.
echo 'bababa' | grep -E '^(a|b)'
tudo está vermelho. E você terá o mesmo problema com-o
. Eu acho quegrep
procura várias correspondências, mas, para a segunda e mais vezes, ela aplica a regexp à direita do que correspondeu à hora anterior (assim comoanana
na segunda vez no seu caso) sem passar a bandeira REG_NOTBOL. Veja tambémecho banana | grep -Eo '^ban|^ana$'
grep
identifica-se comogrep (BSD grep) 2.5.1-FreeBSD
na página de manual referente ao GNU apenas mencionando "opções longas fornecidas para compatibilidade com versões do GNU". Além disso, nenhum aviso de direitos autorais ou menção à GPL (ou FSF). Se ele tem histórico com o utilitário GNU, é difícil dizer.grep
que é discutido na resposta de Decade Moon, que tantas pessoas pensam que é correto, identifica comogrep (GNU grep) 2.5.1-FreeBSD
(como pode ser visto na discussão de bugs), tem um aviso de direitos autorais da FSF e é definitivamente o GNUgrep
. O que o FreeBSD chamabsdgrep
é o que o OpenBSD chamadasgrep
e é BSDgrep
, sem--color
opção outwith a variante FreeBSD isso é o que identifica como.grep (BSD grep) 2.5.1-FreeBSD
, e, ironicamente, é o que uma pessoa na discussão bug sugeriu que o interruptor FreeBSDgrep
para.Respostas:
Eu acho que isso pode ser um bug no grep do FreeBSD. Há um relatório de erro com problemas semelhantes.
fonte