Vi-Befehlsreferenz: Cookbook

< Übersicht

Beim Bearbeiten von Dateien treten immer wieder gleiche oder ähnliche Aufgaben auf. Für diese Aufgaben gibt es oft einfache Lösungen.

Buchstaben- , Wort- und Zeilentausch

Bearbeiten
xp Buchstabendreher wie im Wort "nciht" können korrigiert werden, indem der Cursor auf den ersten der zu tauschenden Buchstaben ('c') gesetzt und dann x eingeben wird. Der Buchstabe 'c' wird gelöscht, das Wort "niht" bleibt übrig. Der gelöschte Buchstabe wird mit p hinter dem Cursor wieder eingefügt.
dwwP Der Cursor wird auf das erste Zeichen des ersten zu tauschenden Wortes gesetzt und dann dw eingegeben. Das Wort wird gelöscht. Mit w wird der Cursor zum Anfang des jetzt nächsten Wortes bewegt. Das gelöschte Wort wird mit P vor der aktuellen Cursorposition wieder eingefügt. Für die letzten beiden Worte einer Zeile funktioniert diese Kombination nicht.
ddp Der Cursor wird auf die erste der zu tauschenden Zeilen gesetzt und dann dd eingegeben. Die Zeile verschwindet. Die gelöschte Zeile wird mit p unter der aktuellen Cursorposition wieder eingefügt.

Schreibpositionen schnell ansteuern

Bearbeiten
ea Am Ende eines Wortes weiterschreiben. e springt an das Ende des Wortes und a fügt nach dem Wort an.
A Am Ende einer Zeile weiterschreiben. A springt an das Ende der Zeile und fügt nach der Zeile an.
wi Am Anfang eines Wortes weiterschreiben. w springt an das erste Zeichen des Wortes und i fügt vor dem Wort ein.
I Am Text-Anfang einer Zeile weiterschreiben. I springt an das erste Zeichen der Zeile und fügt vor der Zeile ein.
|i Am rechten Rand einer Zeile weiterschreiben. | springt an die erste Spalte der Zeile und i fügt vor der Zeile an.
o Unterhalb der aktuellen Zeile weiterschreiben. o öffnet eine neue Zeile unterhalb der aktuellen und fügt dort an.
O Oberhalb der aktuellen Zeile weiterschreiben. O öffnet eine neue Zeile oberhalb der aktuellen und fügt dort an.

Leerzeilen entfernen

Bearbeiten
:g/^[ ^I]*$/d In der gesamten Datei werden Zeilen (g), die von Anfang (^) bis Ende ($) aus beliebig (*) vielen Space- oder Tabulator-Zeichen ([ ^I]) bestehen, gesucht (/../) und gelöscht (d). ^I wird als Strg-V gefolgt von TAB eingegeben und stellt ein Tabulator-Zeichen dar.
:g/^$/d In der gesamten Datei werden Zeilen (g), die von Anfang (^) bis Ende ($) keine Zeichen (^ gefolgt von $) enthalten, gesucht (/../) und gelöscht (d).

Groß- und Kleinschreibung

Bearbeiten
:%s/\<./\u&/g Der Anfangsbuchstabe eines jeden Wortes wird zum Großbuchstaben. In allen Zeilen (:%) wird folgende Ersetzung (s/../../) für alle Fundstellen in der Zeile (g) durchgeführt: ein beliebiges Zeichen (.) am Beginn eines Wortes (\<) wird ersetzt durch den korrespondierenden Großbuchstaben (\u) zu dem gefundenen Zeichen (&). Dies schließt einzelne Buchstaben ein.
:%s/\<[a-z][a-z]/\u&/g Der Anfangsbuchstabe eines jeden Wortes wird zum Großbuchstaben. In allen Zeilen (:%) wird folgende Ersetzung (s/../../) für alle Fundstellen in der Zeile (g) durchgeführt: ein beliebiger Kleinbuchstabe ([a-z]) am Beginn eines Wortes (\<), dem ein weiterer Buchstabe wird ersetzt durch den korrespondierenden Großbuchstaben (\u) zu dem gefundenen Zeichen (&). Dies schließt einzelne Buchstaben aus und alle Wörter mit mehr als zwei Buchstaben ein.
:%s/.*/\L&/ Ersetzt alle Buchstaben durch Kleinbuchstaben. In allen Zeilen (:%) wird folgende Ersetzung (s/../../) für die erste Fundstellen in der Zeile durchgeführt: eine beliebige Anzahl (*) beliebiger Zeichen (.) (= ganze Zeile) wird ersetzt durch die in Kleinbuchstaben gewandelte (\L) gefundene Zeichenkette (&) (= ganze Zeile).
:%s/./\l&/g Ersetzt alle Buchstaben durch Kleinbuchstaben. In allen Zeilen (:%) wird folgende Ersetzung (s/../../) für alle Fundstellen in der Zeile (g) durchgeführt: ein beliebiges Zeichen (.) wird ersetzt durch den korrespondierenden Kleinbuchstaben (\l) zu dem gefundenen Zeichen (&).

Die Funktionen \u, \U, \l, und \L sind auf vim beschränkt.

HTML / XML

Bearbeiten
:%s/<[^>]*>//g löscht alle HTML/XML-Tags; genauer: ersetzt alle Textanteile, die mit < beginnen und mit > enden durch eine leere Zeichenkette
:%s/<[^>]*>/ /g ersetzt alle HTML/XML-Tags durch Leerzeichen; genauer: ersetzt alle Textanteile, die mit < beginnen und mit > enden durch ein Leerzeichen

Sonderzeichen, Unicode

Bearbeiten

Zeichen, die auf der Tastatur nicht vorhanden sind, können im Insert-Mode auf verschiedene Weise eingegeben werden.

Eine Möglichkeit ist die Eingabe von Strg-v, gefolgt von den drei dezimalen Ziffern des Unicode-Wertes (Codepoints) - solange dieser kleiner als 256 ist.

Beispiele:

Zeichen Codepoint (dezimal) Eingabe
© 169 Strg-v 1 6 9
® 174 Strg-v 1 7 4
± 177 Strg-v 1 7 7
× 215 Strg-v 2 1 5
÷ 247 Strg-v 2 4 7

Liste der Unicode-Zeichen mit den Codepoints 0 bis 127 und 128 bis 255

Eine weitere Möglichkeit ist die Eingabe von Strg-v u, gefolgt von den hexadezimalen Ziffern des Unicode-Wertes (Codepoints).

Zeichen Codepoint (hexadezimal) Eingabe
© U+00A9 Strg-v u 0 0 a 9
® U+00AE Strg-v u 0 0 a e
± U+00B1 Strg-v u 0 0 b 1
× U+00D7 Strg-v u 0 0 d 7
÷ U+00F7 Strg-v u 0 0 f 7

Unix- und DOS-Dateien

Bearbeiten

Es kommt doch einige Male im Leben eines Benutzers vor, dass dieser unter Unix DOS-Dateien oder unter DOS Unix-Dateien ändert. Die beiden Dateiformate sind sich sehr ähnlich, aber leider nicht identisch. DOS hängt an jedes Zeilenende zwei Zeichen (Carriage Return CR und Line Feed LF), Unix dagegen nur ein Zeichen (LF). Viele Editoren ignorieren dies und zeigen eben nur eine Zeile an oder hängen, wenn sie eine Unix-Datei öffneten, einfach ein CR/LF an jede Zeile an und machen so die Unix-Datei (für manche Programme) unlesbar. Dies kann auch bei einem Versionsmanagementsystem (z.B. CVS) zu Problemen führen, da alle(!) Zeilen geändert wurden. Vi ändert die Datei nicht.

Vi bietet über den Suche- und Ersetzungsmechanismus eine einfache Möglichkeit alle CR-Zeichen zu suchen und eben durch nichts zu ersetzen. Auf die gleiche Weise kann er jedes Zeilenende zusätzlich mit einem CR auszustatten. Die Eingabe eines Sonderzeichens (CR - ASCII 13) erfolgt über Strg-V und dann Strg-M (merke: M ist der 13. Buchstabe). Der Vi zeigt diese Sonderzeichen als ^M an. Bei der Cursornavigation erkennt man, dass dies wirklich nur ein Zeichen ist. Mit diesem Wissen lässt sich der Ausdruck aufschreiben.

Nochmals bitte ^M als Strg-V Strg-M eingeben.

:%s/^M//g

Erläuterung: % bezieht sich auf alle Zeilen in der Datei. Mit s wird der Ersetzungsmechanismus eingeleitet. ^M ist das Suchmuster und mit // wird das ^M eben durch nichts ersetzt. Das g am Ende steht für global und ersetzt alle Vorkommen pro Zeile (bei nur einem CR pro Zeile ist es also hier nicht erforderlich).

Sollen Unix-Dateien in Dos-Dateien umgewandelt werden, dann geschieht dies wiederum über den Ersetzungsmechanismus:

:%s/$/^M/

Erläuterung: Wie oben, jedoch wird vor jedem Zeilenende ($) das ASCII-Zeichen 13 (= CR = ^M) eingefügt. (Eine erneute Eingabe des $-Zeichens nach dem ^M ist nicht erforderlich, da der Unix-Zeilenumbruch (ASCII-Zeichen 10 = LF) automatisch erhalten bleibt.)


Tabelle umformatieren

Bearbeiten

Mit dem folgenden Makro kann eine CSV-Tabelle in eine Tabelle mit fester Spaltenbreite umgewandelt werden. Am anschaulichsten wird dies durch ein Beispiel. Gegeben sei folgende CSV-Tabelle:

Kevin;Stark;76275
Janine;Meister;75432
Jo;Edenkober;04531

Diese Tabelle soll folgende Gestalt erhalten:

Kevin          Stark          76275
Janine         Meister        75432
Jo             Edenkober      04531

Hier kommt ein möglicher Lösungsweg:

Tastenfolge Erläuterung
Navigiere zur ersten Zeile, die entsprechend des Beispiels umgebaut werden soll.
<Esc> Gehe in Befehls-Modus.
qa Starte die Makro-Aufzeichnung in Register a.
:s/;/             ;/<Return> Füge in der aktuellen Zeile vor dem ersten Vorkommen von ; eine genügend große Anzahl von Leerzeichen ein (mehr als der längste Feldwert Zeichen hat).
015lvf;dj0 Gehe an den Zeilenanfang (0), gehe 15 Zeichen nach rechts (15l), starte den visuellen Modus (v), erweitere die Selektion bis zum nächsten Semikolon rechts (f;), lösche die Selektion (d) und gehe an den Anfang der Folgezeile (j0).
q Beende die Aufzeichnung des Makros.
@a Führe das Makro in Register a aus.
@@ Wiederhole das letzte Makro (dies muss so oft passieren, bis alle Zeilen bearbeitet wurden).

Um auch das dritte Feld in Position zu bringen und das noch verbliebene zweite Semikolon jeder Ausgangszeile zu ersetzen, ist der ganze Ablauf erneut durchzuführen, allerdings muss dort, wo oben 15 eingegeben wurde, 30 (oder ein anderer geeigneter Wert) eingegeben werden. Dazu muss das Makro nicht unbedingt erneut aufgezeichnet werden. Statt dessen kann man es auch textuell nachbearbeiten: Im Befehls-Modus wird mit "ap der Inhalt des Registers a an der aktuellen Dateiposition eingefügt. Dazu bewegt man sich sinnvollerweise zuerst an den Dateianfang oder das Dateiende. In der eingefügten Zeile kann man bequem die 15 durch eine 30 ersetzen. Mit 0"ay$ überschreibt man schließlich das Register a mit dem Inhalt der aktuellen Zeile.