Eu acho que o seguinte comando deve funcionar:
:%s/^\(.*\)\(\n\1\)\+$/\1/
Explicação:
Usamos o comando de substituição em todo o arquivo para mudar pattern
para string
:
:%s/pattern/string/
Aqui pattern
está ^\(.*\)\(\n\1\)\+$
e string
é \1
.
pattern
pode ser dividido assim:
^\(subpattern1\)\(subpattern2\)\+$
^
e $
correspondem, respectivamente, ao início da linha e ao final da linha.
\(
e \)
são usados para incluir, subpattern1
para que possamos nos referir a ele mais tarde pelo número especial \1
.
Eles também são usados para delimitar, subpattern2
para que possamos repeti-lo 1 ou mais vezes com o quantificador \+
.
subpattern1
is .*
.
é um metacaractere que corresponde a qualquer caractere, exceto a nova linha, e *
é um quantificador que corresponde ao último caractere 0, 1 ou mais vezes.
Portanto, .*
corresponde a qualquer texto que não contenha nova linha.
subpattern2
é \n\1
\n
corresponde a uma nova linha e \1
corresponde ao mesmo texto que foi correspondido dentro da primeira \(
, \)
que aqui é subpattern1
.
Então, pattern
pode ser lida assim:
um início de linha ( ^
) seguido por qualquer texto contendo nenhuma linha nova ( .*
) seguido por uma nova linha ( \n
), em seguida, o mesmo texto ( \1
), os dois últimos sendo repetido uma ou mais vezes ( \+
), e finalmente um fim de linha ( $
) .
Onde quer que pattern
seja correspondido (um bloco de linhas idênticas), o comando de substituição o substitui pelo string
qual está aqui \1
(a primeira linha do bloco).
Se você deseja ver quais blocos de linhas serão afetados sem alterar nada no seu arquivo, é possível ativar a hlsearch
opção e adicionar o n
sinalizador de substituição no final do comando:
:%s/^\(.*\)\(\n\1\)\+$/\1/n
Para um controle mais granular, você também pode solicitar uma confirmação antes de alterar cada bloco de linhas adicionando o c
sinalizador de substituição:
:%s/^\(.*\)\(\n\1\)\+$/\1/c
Para obter mais informações sobre o comando de substituição :help :s
, leia ,
para os sinalizadores de substituição :help s_flags
,
para os vários metacaracteres e quantificadores :help pattern-atoms
,
e para expressões regulares no vim, leia isso .
Editar: o curinga corrigiu um problema no comando adicionando um $
no final de pattern
.
Também o BloodGain possui uma versão mais curta e legível do mesmo comando.
$
disso, no entanto. Caso contrário, ele fará coisas inesperadas com uma linha que começa com texto idêntico à linha anterior, mas possui outros caracteres à direita. Observe também que o comando básico que você deu é funcionalmente equivalente à minha resposta:%!uniq
, mas os sinalizadores de destaque e confirmação são bons.