To main content

VIM: Alle Zeilen mit einem bestimmten Muster löschen

Veröffentlicht von Benjamin Marwell am

In Konfigurationsdateien und Reports möchte man öfters mal bestimmte Arten von Zeilen löschen, etwa Leerzeilen und/oder Zeilen mit einem anderen bestimmten Muster (sog. Pattern via RegEx). Mit dem ex-Befehl delete (:d ) klappt es auf Anhieb nicht, dafür aber mit :g .

Erster Ansatz

Schließt man fälschlicher Weise auf den Befehl :d und versucht eine Range-Angabe zu machen, so passiert vielleicht so etwas:

:/{pattern}/{pattern2}/d

Dieser Befehl löscht allerdings alle Zeilen, angefangen bei {pattern}, bis hin zu {pattern2} (jeweils einschließlich).

Der Befehl "global"

Korrekt funktioniert es mit dem Befehl global (:g), der eine Aktion für bestimmte Zeilen wiederholt. Der Aufbau ist wie folgt:

:[range]g[lobal]/{pattern}/[Befehl]

Wird der Befehl aus- bzw. weggelassen, so wird an dieser Stelle print (:p) eingefügt. Für unsere Zwecke ergeben sich also folgende Möglichkeiten:

Alle Leerzeilen löschen

:g/^\s*$/d

Alle Zeilen mit '.profile' löschen

:g/\.profile/d

Vorher sollte das d eventuell ausgelassen werden, damit man erkennt, ob man die richtigen Zeilen erwischt hat. Nur allzu schnell vergisst man, den Punkt zu escapen oder vertippt sich anderweitig. Ansonsten sind diese mit dem Befehl u (undo) schnell wiederherstellbar.

Zeilen vom Löschen ausschließen

Das Gegenteil funktioniert natürlich auch. Es wird einfach hinter dem :g  ein Ausrufezeichen (!) angefügt:

:g!/\.profile/d

Was bringt es?

Kurz gesagt: Man spart sich das Ausführen eines externen Befehls wie etwa awk/grep  via:
:%!
Viel Spaß damit!

Links zum Thema