Creo que el siguiente comando debería funcionar:
:%s/^\(.*\)\(\n\1\)\+$/\1/
Explicación
Usamos el comando de sustitución en todo el archivo para cambiar pattern
a string
:
:%s/pattern/string/
Aquí pattern
está ^\(.*\)\(\n\1\)\+$
y string
está \1
.
pattern
puede desglosarse así:
^\(subpattern1\)\(subpattern2\)\+$
^
y $
coinciden respectivamente un principio de línea y un final de línea.
\(
y \)
se usan para encerrar subpattern1
para que podamos referirnos más tarde por el número especial \1
.
También se usan para encerrar subpattern2
para que podamos repetirlo 1 o más veces con el cuantificador\+
.
subpattern1
Este es .*
.
un metacarácter que coincide con cualquier carácter, excepto una nueva línea, y *
es un cuantificador que coincide con el último carácter 0, 1 o más veces.
Por lo tanto, .*
coincide con cualquier texto que no contenga una nueva línea.
subpattern2
es \n\1
\n
coincide con una nueva línea y \1
coincide con el mismo texto que coincidió dentro de la primera \(
, \)
que aquí estásubpattern1
.
Por pattern
lo tanto, puede leerse así:
un comienzo de línea ( ^
) seguido de cualquier texto que no contenga una nueva línea ( .*
) seguido de una nueva línea ( \n
), luego el mismo texto ( \1
), repitiéndose los dos últimos una o más veces ( \+
), y finalmente un final de línea ( $
) .
Dondequiera pattern
que coincida (un bloque de líneas idénticas), el comando de sustitución lo reemplaza con el string
que aquí está\1
(la primera línea del bloque).
Si desea ver qué bloques de líneas se verán afectados sin cambiar nada en su archivo, puede habilitar la hlsearch
opción y agregar el n
indicador de sustitución al final del comando:
:%s/^\(.*\)\(\n\1\)\+$/\1/n
Para un control más granular, también puede solicitar una confirmación antes de cambiar cada bloque de líneas agregando el c
indicador de sustitución
:%s/^\(.*\)\(\n\1\)\+$/\1/c
Para obtener más información sobre la lectura comando de sustitución :help :s
,
para la sustitución de las banderas :help s_flags
,
para los diversos metacaracteres y cuantificadores leen :help pattern-atoms
,
y expresiones regulares en vim leen este .
Editar: Comodín solucionó un problema en el comando agregando un $
al final de pattern
.
También BloodGain tiene una versión más corta y más legible del mismo comando.
$
embargo, su comando necesita un en él. De lo contrario, hará cosas inesperadas con una línea que comienza con un texto idéntico a la línea anterior, pero tiene algunos otros caracteres finales. También tenga en cuenta que el comando básico que proporcionó es funcionalmente equivalente a mi respuesta de:%!uniq
, pero los indicadores de resaltado y confirmación son agradables.