/(.+)\n\1/ funciona mas /(.*)\n\1/ não quando ambos devem trabalhar

4

Eu estava brincando com sed depois de responder a outra pergunta e notei que .+ e .* não estão dando o mesmo resultado quando ambos combinam vários caracteres em um endereço de contexto.
O seguinte comando 1 :

sed -E '$!N;/(.+)\n/!P;D' <<IN
one
one_more
two
two_more
IN

imprime

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/!P;D' <<IN
one
one_more
two
two_more
IN

imprime apenas uma linha

two_more

O que está acontecendo aqui?

1: Estou usando ERE para simplicidade / legibilidade, o mesmo acontece quando se usa BRE

    
por don_crissti 24.10.2018 / 21:18

1 resposta

8

Isso acontece porque /(.*)\n/ também está correspondendo a uma nova linha simples ( \n : seqüência vazia, seguida por nova linha, seguida da sequência vazia mesma desde o início).

Por isso, também corresponderá à string one_more\ntwo do seu exemplo.

Para evitar isso, você precisará ancorar seus regexps, por exemplo sed -E '$!N;/^(.+)\n/!P;D' ou sed -E '$!N;/^(.*)\n/!P;D' .

    
por 24.10.2018 / 22:03