UNIX-TIP des Monats


In diesem Monat will ich mich ein bisschen mit dem "beliebten" Texteditor vi in unser UNIX-Ecke auseinandersetzen. Zugegeben er kommt reichlich schmucklos daher und überzeugt nicht gerade durch Bedienerfreundlichkeit. Um genau zu sein, viele Erstanwender halten ihn für das UNIX gewordene Ebenbild des DOS edlin. Wer sich aber die Zeit nimmt, ein wenig genauer hinter die unansehnliche Fassade zu schauen, wird das eine oder andere erstaunliche Feature entdecken und dann vielleicht seine Meinung revidieren.
Genau um solche kleinen netten Kniffe soll es im Nachfolgenden gehen. Natürlich weiss ich auch, dass der vi nur schwer mit dem allmächtigen emacs konkurrieren kann - darum geht es aber auch gar nicht. Vielmehr soll gezeigt werden, wie man ihn einsetzen kann, wo er nun schon mal auf der Platte liegt.


Ein paar kurze geschichtliche Details

Der vi gehört zu den Erweiterungen aus der BSD-Welt. Nochmal zur Erinnerung: Das ursprünglich bei den Bell Laboratorys entstandene UNIX wurde in der der Version 6 das erste Mal von einer breiteren Anwenderschaft ausserhalb der Laboratorys genutzt. Viele Anwender waren Universitäten, die teilweise ihre eigenen Releases erstellten. Eine dieser Universitäten war die University of California in Berkeley, deren Releases als BSD (Berkely Software Distribution) einen großen Verbreitungsgrad fanden. An diesen BSD Releases haben Studenten maßgeblichen Anteil gehabt. Einer dieser Studenten war Bill Joy, der spätere Mitgründer von SUN Microsystems. Er war es, der den vi der Berkeley Software Distribution zusammen mit weiteren Programmen hinzugefügt hat.

Marken

Als ich anfing, mit dem vi zu arbeiten, habe ich immer nach so etwas wie einer Blockmarkierung gesucht. Erreichen kann man einen ähnlichen Effekt mit den "Marken" des vi. Man setzt einfach eine Marke an den Anfang und eine Marke an das Ende des Zeilenbereiches, den man bearbeiten will.
Eine Marke wird entweder mit

mBuchstabe

oder mit
:kBuchstabe

gesetzt. Buchstabe muss dabei durch ein einzelnes Zeichen (a-z) ersetzt werden.
Eine Marke wird mit
'Buchstabe

angesprochen. Diese Marken können nun alternativ zu Zeilennummern in all jenen Kommandos eingesetzt werden, die eine Bereichsangabe erfordern. Zwei Beispiele für solche Befehle sind besonders interessant:

Suchen und Ersetzen

Zugegeben Suchen und Ersetzen kann eigentlich heute jeder Editor. Aber Editoren, die dabei als Suchmuster reguläre Ausdrücke zulassen, gibt es nicht viele. Der vi tut es.
Wie ist ein Befehl zum Suchen und Ersetzen aufgebaut? Zunächst einmal muss ein solcher Befehl im ex-Modus (erreicht man durch Eingabe eines Doppelpunktes) abgesetzt werden und besteht dann aus drei Komponenten:

Die Bereichsangabe und die Optionen sind optional. Fehlt eine Bereichsangabe, wird auf der aktuellen Zeile gesucht und ggf. ersetzt.
Ein Bereich kann wie folgt definiert werden:
Zeile,Zeile z.B. 10,45 für Zeile 10 bis 45 oder 1,$ für die ganze Datei
Marke,Marke z.B. 'a,'e mit a als Anfangsmarke und e als Endemarke

Der Ersetzungsbefehl sieht aus wie folgt:
s/Suchmuster/Ersetzung/

Das Suchmuster kann dabei ein regulärer Ausdruck sein. Dem Ersetzungsbefehl können noch Optionen folgen. Eine Option ist ein einzelner Buchstabe. Folgende Optionen sind verfügbar:
g Das g steht für global und bedeutet, dass nicht nur das erste Auftreten des Suchmusters in einer Zeile ersetzt wird, sondern alle.
c Das c steht für confirm und sorgt dafür, dass vor jeder Ersetzung beim Benutzer nachgefragt wird.

Ein paar Beispiele für beliebte Ausdrücke sind
1,$ s/^/Hallo:/ Dieses Kommando fügt vor jeder Zeile in der Datei die Zeichenkette Hallo: ein.
1,$ s/$/;/ Mit diesem Kommando wird an jede Zeile in der Datei ein Semikolon angehängt.
1,$ s/.*/mv & &.old/ Macht aus einer Liste mit Dateinamen, eine Liste mit mv-Kommandos.
1,$ s/[Yy][Aa][Ss][Cc]/\L&/g Dieses Kommando formt eine beliebige Groß- / Kleinschreibung von yasc in Kleinschreibung um.
1,$ s/\([Tt]reat\) or \([Tt]rick\)/\2 or \1/ Dieses Beispiel ist wirklich ein wenig tricky. Es vertauscht die beiden Worte treat und trick und benutzt dabei sog. Hold-Buffer. Das hat den Vorteil, dass dieses Kommando auch für unterschiedliche Schreibweisen funktioniert. Die Holdbuffer 1-9 werden für Ausdrücke im Suchmuster, die in \(   \) eingeschlossen sind, vergeben.



Ausführung eines UNIX-Befehls auf einem Zeilenbereich

Den Abschluß der netten vi Features bildet die Ausführung eines UNIX-Befehls auf einem Zeilenbereich. Auch solche Befehle müssen wieder im ex-Modus abgesetzt werden - also nach Eingabe eines Doppelpunktes.
Die Wirkungsweise eines solchen Befehls kann man am besten an einem Beispiel erklären:

'a,'e  !  sort  -uf In diesem Beispiel wird auf die Zeilen der Datei zwischen den Marken a und b das UNIX-Kommando sort -uf - also alphabetisch Sortieren mit Entfernung doppelter Zeilen - angewandt und dann die Zeilen zwischen den Marken durch das Ergebnis des sort-Kommandos ersetzt.



Weniger kryptisch wird der vi zwar durch diese Ausführungen nicht, aber vielleicht ein wenig attraktiver. Falls Sie Anregungen oder Wünsche für die Themen auf dieser Seite haben, freuen wir uns auf Ihre E-Mail.

Viel Spaß beim Probieren und schauen Sie mal wieder rein!


Startseite




Letzte Änderung 1997/03/11: © Lutz Brockmann