Je pense que la commande suivante devrait fonctionner:
:%s/^\(.*\)\(\n\1\)\+$/\1/
Explication:
Nous utilisons la commande de substitution sur l'ensemble du fichier pour changer patternen string:
:%s/pattern/string/
Ici patternest ^\(.*\)\(\n\1\)\+$et stringest \1.
pattern peut être décomposé comme ceci:
^\(subpattern1\)\(subpattern2\)\+$
^et $correspondent respectivement à un début de ligne et à une fin de ligne.
\(et \)sont utilisés pour joindre subpattern1afin que nous puissions y faire référence plus tard par le numéro spécial \1.
Ils sont également utilisés pour entourer subpattern2afin que nous puissions le répéter 1 ou plusieurs fois avec le quantificateur \+.
subpattern1is .*
.est un métacaractère correspondant à n'importe quel caractère sauf la nouvelle ligne et *est un quantificateur qui correspond au dernier caractère 0, 1 ou plusieurs fois.
Correspond donc à .*tout texte ne contenant pas de nouvelle ligne.
subpattern2is \n\1
\ncorrespond à une nouvelle ligne et \1correspond au même texte qui a été trouvé à l'intérieur de la première \(, \)qui est ici subpattern1.
On patternpeut donc le lire ainsi:
un début de ligne ( ^) suivi de tout texte ne contenant pas de nouvelle ligne ( .*) suivi d'une nouvelle ligne ( \n) puis du même texte ( \1), les deux derniers étant répétés une ou plusieurs fois ( \+), et enfin une fin de ligne ( $) .
Partout où patternest mis en correspondance (un bloc de lignes identiques), la commande de substitution le remplace par stringlequel se trouve ici \1(la première ligne du bloc).
Si vous souhaitez voir quels blocs de lignes seront affectés sans rien changer dans votre fichier, vous pouvez activer l' hlsearchoption et ajouter l' nindicateur de substitution à la fin de la commande:
:%s/^\(.*\)\(\n\1\)\+$/\1/n
Pour un contrôle plus précis, vous pouvez également demander une confirmation avant de modifier chaque bloc de lignes en ajoutant à la cplace l'indicateur de substitution:
:%s/^\(.*\)\(\n\1\)\+$/\1/c
Pour plus d'informations sur la commande de substitution lue :help :s,
pour les indicateurs de substitution :help s_flags,
pour les différents métacaractères et quantificateurs lus :help pattern-atoms,
et pour les expressions régulières dans vim, lisez ceci .
Edit: Wildcard a corrigé un problème dans la commande en ajoutant un $à la fin de pattern.
Aussi BloodGain a une version plus courte et plus lisible de la même commande.
$. Sinon, il fera des choses inattendues avec une ligne qui commence par un texte identique à la ligne précédente, mais qui a d'autres caractères de fin. Notez également que la commande de base que vous avez donnée est fonctionnellement équivalente à ma réponse:%!uniq, mais les indicateurs de surbrillance et de confirmation sont agréables.