Files
Snippets/Vi.md
T
2026-09-13 13:50:16 +02:00

4.1 KiB
Raw Blame History

Vi

alle Zeilen löschen mit Bedingung löschen

Variante 1

:g/foo/d

:g/pattern/d → löscht alle Zeilen, auf die das Muster passt.

Variante 2 Substitution

Mit Suchen & Ersetzen (Substitute) die ganze Zeile löschen

:%s/.*foo.*//g

Variante 3 Zeilenanfang

:g/^bar/d`

löscht Zeilen, die mit „bar“ beginnen

Variante 4 Negation

:v/baz/d

löscht alle Zeilen, die NICHT „baz“ enthalten

Variante 5 Kombination

:g/\(error\|warning\)/d

löscht Zeilen, die „error“ ODER „warning“ enthalten.

Löschen von Leerzeichen am Zeilenanfang

:%g/^$/d

Löschen von Leerzeilen

:g/^$/d

Löschen von Leerzeichen/Tabs am Zeileende jeder Zeile

:%s/\s\+$//
  • :%s – Suchen & Ersetzen in der ganzen Datei
  • \s\+ – ein oder mehrere Whitespace-Zeichen (Leerzeichen, Tabs)
  • $ – am Zeilenende
  • // – ersetzen durch nichts (also löschen)

Varianten

  • :%s/ \+$// Nur Leerzeichen (keine Tabs) am Ende entfernen

  • :%s/\t\+$//Nur Tabs am Ende entfernen

  • :s/\s\+$// Nur in der aktuellen Zeile

Arbeiten mit Blöcken

Hier geht es darum das ein Block aus einer Anzahl Zeilen besteht. Die erste Zeile beinhaltet den ersten Begriff (Begriff1) zur Identifizierung des Blockes und eines zweiten Begiffes (Begriff2) der das Ende kennzeichnet, alles um diese Blöcke soll entfernt werden.

getestete Variante:

:%!sed -n '/Begriff1/,/Begriff2/p'

Direkt im Terminal:

sed -n '/Begriff1/,/Begriff2/p' datei.txt > ausgabe.txt

Erklärung:

:%! – schickt den gesamten Pufferinhalt durch ein externes Kommando sed -n – unterdrückt die normale Ausgabe /Begriff1/,/Begriff2/p – gibt nur die Zeilen von Begriff1 bis Begriff2` aus (inklusive beider Zeilen)

Löschen von Zeilenanfang bis zu einem bestimmten Begriff

:%s/^.*\zeBegriff//

^.* → alles vom Zeilenanfang \ze → „hier endet der Match“ SUCHTEXT bleibt erhalten

Speichern als

:w <neuer Name>

Zeilen zusammenfügen

Von einer Zeile bis zum Dateiende alle Zeilen zusammenfügen

:.,$-1join

Erklärung:

  • . = aktuelle Zeile
  • $-1 = vorletzte Zeile (die letzte hat ja nichts mehr zum Anhängen)
  • join (oder kurz j) verbindet jede Zeile mit der folgenden

Beispiel:

Vorher:

eins
zwei
drei
vier

Nach :1,$-1join:

eins zwei drei vier

Falls man jeweils nur zwei Zeilen paarweise verbinden will (also 1+2, 3+4, 5+6 …), dann ist join allein nicht genug, weil es alles zu einer einzigen Zeile macht.

Daher:

:%norm Jj

Das macht für jede Zeile:

  • J → nächste Zeile anhängen
  • j → zur nächsten unbearbeiteten Zeile springen

Beispiel:

Vorher:

a
b
c
d
e
f

Nachher:

a b
c d
e f

Makros

Aufzeichnen

qa

a ist nur Beispiel

Ausführen

@a

a ist nur Beispiel

Mehrfaches Ausführen

100@a

Aus alter Datei

Bestimmte Phrasen in Kleinbuchstaben umwandeln

:%s/\(Zum Beispiel[^.!?]*[.!?]\)/\L\1/g

Erläuterung:

  • :%s/…/…/g – Sucht und ersetzt global in der ganzen Datei.
  • \(…\) – Gruppiert den Treffer, um ihn als \1 später referenzieren zu können.
  • Zum Beispiel – Die Zielphrase am Satzanfang.
  • [^.!?]* – Beliebig viele Zeichen, bis zu einem Satzendezeichen.
  • [.!?] – Der Satz endet mit Punkt, Ausrufezeichen oder Fragezeichen.
  • \L\1 – Wandelt den Inhalt von \1 (dem gefundenen Satzteil) in Kleinbuchstaben um

Jede leere Zeile löschen

:g/^$/d
  • :g – Wendet den Befehl auf alle Zeilen an, die einem Muster entsprechen.
  • ^$ – Das Muster für eine leere Zeile: Zeilenanfang (^) gefolgt von Zeilenende ($), also nichts dazwischen.
  • d – Löscht die jeweilige Zeile.

oder aber alternativ:

  • mit v —> nicht passende Zeilen behalten, so also :v/\S/d
    • \S bedeutet nicht-Leerzeichen

oder

  • mit :g/^\s*$/d
    • :g → global: wende auf alle Zeilen an, die passen
    • ^\s*$ → Zeilen, die nur aus Leerzeichen/Tabs (oder gar nichts) bestehen
    • d → lösche diese Zeilen

Zeile in ein Register kopieren

  • ”ayy

Zeile aus einem Register einfügen

  • <ESC>”ap