Eu estava brincando sed
depois de responder a outra pergunta e notei isso .+
e .*
não estão dando o mesmo resultado quando ambos correspondem a vários caracteres em um endereço de contexto.
O seguinte comando 1 :
sed -E '$!N;/(.+)\n\1/!P;D' <<IN
one
one_more
two
two_more
IN
impressões
one_more
two_more
OK, essa é a saída esperada.
Alterar o regex de .+
para .*
(ou seja, de um ou mais caracteres para zero ou mais caracteres ) deve dar o mesmo resultado, mas não:
sed -E '$!N;/(.*)\n\1/!P;D' <<IN
one
one_more
two
two_more
IN
imprime apenas uma linha
two_more
O que está acontecendo aqui ?
1: Estou usando o ERE por simplicidade/legibilidade, o mesmo acontece ao usar o BRE
Isso acontece porque
/(.*)\n\1/
também está correspondendo a uma nova linha simples (\n
: string vazia, seguida por nova linha, seguida pela mesma string vazia desde o início).Portanto, também corresponderá à string
one_more\ntwo
do seu exemplo.Para evitar isso, você terá que ancorar seus regexps, por exemplo
sed -E '$!N;/^(.+)\n\1/!P;D'
oused -E '$!N;/^(.*)\n\1/!P;D'
.