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 pattern
en string
:
:%s/pattern/string/
Ici pattern
est ^\(.*\)\(\n\1\)\+$
et string
est \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 subpattern1
afin que nous puissions y faire référence plus tard par le numéro spécial \1
.
Ils sont également utilisés pour entourer subpattern2
afin que nous puissions le répéter 1 ou plusieurs fois avec le quantificateur \+
.
subpattern1
is .*
.
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.
subpattern2
is \n\1
\n
correspond à une nouvelle ligne et \1
correspond au même texte qui a été trouvé à l'intérieur de la première \(
, \)
qui est ici subpattern1
.
On pattern
peut 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ù pattern
est mis en correspondance (un bloc de lignes identiques), la commande de substitution le remplace par string
lequel 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' hlsearch
option et ajouter l' n
indicateur 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 c
place 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.