Ich denke, der folgende Befehl sollte funktionieren:
:%s/^\(.*\)\(\n\1\)\+$/\1/
Erklärung:
Wir verwenden die Substitution Befehl auf die gesamte Datei zu ändern pattern
in string
:
:%s/pattern/string/
Hier pattern
ist ^\(.*\)\(\n\1\)\+$
und string
ist \1
.
pattern
kann wie folgt aufgeteilt werden:
^\(subpattern1\)\(subpattern2\)\+$
^
und $
stimmen jeweils mit einem Zeilenanfang und einem Zeilenende überein.
\(
und \)
dienen zum Einschließen, subpattern1
damit wir später durch die spezielle Nummer darauf verweisen können \1
.
Sie werden auch zum Einschließen verwendet, subpattern2
damit wir sie mindestens einmal mit dem Quantor wiederholen können \+
.
subpattern1
ist .*
.
ein Metazeichen, das mit einem beliebigen Zeichen außer einer neuen Zeile übereinstimmt, und *
ein Quantifizierer, der mit dem letzten Zeichen 0, 1 oder mehrmals übereinstimmt .
Stimmt also .*
mit jedem Text überein, der keine neue Zeile enthält.
subpattern2
Es \n\1
\n
stimmt mit einer neuen Zeile \1
überein und stimmt mit dem gleichen Text überein, der in der ersten übereinstimmte. Dies \(
ist \)
hier subpattern1
.
Man pattern
kann also so lesen:
ein Zeilenanfang ( ^
) gefolgt von einem beliebigen Text, der keine neue Zeile ( .*
) enthält, gefolgt von einer neuen Zeile ( \n
) und demselben Text ( \1
), wobei die beiden letzteren ein oder mehrere Male wiederholt werden ( \+
) und endlich ein Zeilenende ( $
) .
Wo immer pattern
eine Übereinstimmung vorliegt (ein Block mit identischen Zeilen), ersetzt der Ersetzungsbefehl string
den hier angegebenen \1
(die erste Zeile des Blocks).
Wenn Sie sehen möchten, welche Zeilenblöcke betroffen sind, ohne etwas in Ihrer Datei zu ändern, können Sie die hlsearch
Option aktivieren und das n
Substitutionsflag am Ende des Befehls hinzufügen :
:%s/^\(.*\)\(\n\1\)\+$/\1/n
Für eine genauere Kontrolle können Sie auch eine Bestätigung anfordern, bevor Sie jeden Zeilenblock ändern, indem Sie c
stattdessen das Substitutionsflag hinzufügen :
:%s/^\(.*\)\(\n\1\)\+$/\1/c
Weitere Informationen über die Substitution Lesebefehl :help :s
,
für die Substitution Fahnen :help s_flags
,
für die verschiedenen Metazeichen und quantifiers lesen :help pattern-atoms
,
und für reguläre Ausdrücke in vim lesen diese .
Bearbeiten: Platzhalter behebt ein Problem im Befehl durch Hinzufügen eines $
am Ende von pattern
.
Auch BloodGain hat eine kürzere und besser lesbare Version des gleichen Befehls.
$
. Andernfalls werden unerwartete Aktionen mit einer Zeile ausgeführt, die mit dem gleichen Text wie die vorherige Zeile beginnt , jedoch andere nachgestellte Zeichen enthält. Beachten Sie auch, dass der grundlegende Befehl, den Sie gaben, meiner Antwort von funktional entspricht:%!uniq
, aber die Markierungs- und Bestätigungs-Flags sind nett.