Januar 2014: Der Stream-Editor sed

Autoren: Michael Gisbers und Christian Hesse

In den vorangegangenen Artikeln dieser Reihe haben wir mit `openssh` und `openssl` die Bereiche Zugriffssicherheit und Verschlüsselung behandelt. Hier geht es nun um einen der kleinen Helfer auf der Kommandozeile, das Progamm `sed`. Die Manual Page (`man 1 sed`) bezeichnet den `sed` als 'Stream-Editor zum Filtern und Transformieren von Text', womit das Einsatzgebiet genau beschrieben ist.

Einfaches Ersetzen von Text

Bevor wir einen Text bearbeiten, legen wir ihn als Datei an, um daran unsere Filter- und Transformationsoperationen auszuführen. Damit er nicht zu lang wird und wir die Ergebnisse der Ausgaben nicht immer kürzen müssen, benutzen wir den folgenden Inhalt für die Datei `/tmp/datei.txt`

Hello World,
welcome to SED, the Steam-Editor (SED).
We hope you ENJOY this short tutorial.
Just try to filter and transform your own text files.

Natürlich enthält diese Datei ein paar kleine Fehler, die wir nun mit dem `sed` beheben. `sed` wird nicht mit Großbuchstaben geschrieben, daher müssen wir `SED` gegen `sed` tauschen. Dafür gibt es den Befehl 'Substitute'. Diejenigen, die schon mit Perl gearbeitet haben, werden dessen Aufbau schnell wiedererkennen.

s/quelle/ziel/

Dabei steht das `s` am Anfang des Ausdrucks für 'Substitute'. Zwischen den Schrägstrichen stehen zunächst der ersetzende und dann der Ersatztext. Beginnen wir mit einem einfachen Beispiel:

user@linux ~ $ sed -e "s/SED/sed/" /tmp/datei.txt
Hello World,
welcome to sed, the Steam-Editor (SED).
We hope you ENJOY this short tutorial.
Just try to filter and transform your own text files.

Wie gewünscht, hat `sed` die Quelle (`SED`) in das Ziel (`sed`) umgewandelt. Allerdings macht er das nur einmal pro Zeile, in der die Quelle gefunden wird. Gibt es mehrere Quellen, die in einer Zeile transformiert werden sollen, muss dies über den Modifizierer 'Global' (`g`) angegeben sein, der an den Ausdruck angehängt wird.

user@linux ~ $ sed -e "s/SED/sed/g" /tmp/datei.txt
Hello World,
welcome to sed, the Steam-Editor (sed).
We hope you ENJOY this short tutorial.
Just try to filter and transform your own text files.

Manchmal ist es sinnvoller, nur die wirklich geänderten Zeilen zu sehen, dann wird über den zusätzliche Modifizierer 'Print' (`p`) nur die modifizierte Zeile ausgegeben. Darüber hinaus weisen wir `sed` über die Option `-n` ('quiet') an, nur noch die Zeilen auszugeben, die über einen Print-Modifizierer ausgegeben werden sollen.

user@linux ~ $ sed -n -e "s/SED/sed/gp" /tmp/datei.txt
welcome to sed, the Steam-Editor (sed).

Ein weiterer Modifizierer ist 'Insensitive' (`i`). Mit ihm unterscheidet `sed` nicht mehr zwischen Klein- und Großbuchstaben. Damit funktioniert dann auch das folgende Beispiel.

user@linux ~ $ sed -n -e "s/SeD/sed/gpi" /tmp/datei.txt
welcome to sed, the Steam-Editor (sed).

Es lassen sich auch mehrere Änderungen an einer Datei in einem `sed`-Aufruf durchführen. Dazu werden entweder mehrere Skripte über die Option `-e` angegeben oder innerhalb eines Skriptes die Aufrufe durch ein Semikolon (`;`) getrennt.

user@linux ~ $ sed -e "s/SED/sed/g ; s/Steam/Stream/ ; s/ENJOY/enjoy/" /tmp/datei.txt
Hello World,
welcome to sed, the Stream-Editor (sed).
We hope you enjoy this short tutorial.
Just try to filter and transform your own text files.

Das Ziel einer Substitution muss nicht immer gefüllt sein. Ist es leer, wird der in der Quelle angegebene Text aus der Ausgabe entfernt. Im folgenden Beispiel wird das überflüssige `(SED)` am Ende der zweiten Zeile entfernt.

user@linux ~ $ sed -e "s/ (SED)//" /tmp/datei.txt
Hello World,
welcome to SED, the Steam-Editor.
We hope you ENJOY this short tutorial.
Just try to filter and transform your own text files.

Direktes Ändern der Datei

Bisher hat `sed` immer die Ergebnisse auf die Konsole ausgegeben. Da die Ergebnisse in der Datei erscheinen sollen, könnte man nun auf die Idee kommen, die Ausgabe in dieselbe Datei umzuleiten. Das funktioniert aber nicht, da die Umleitung zuerst von der aufrufenden Shell geöffnet wird und danach erst die Datei von `sed`. Das Resultat ist dann eine leere Datei. Mit der Option `-i` ('inplace') wird die Datei von `sed` ausgelesen und das Ergebnis in eine Datei gleichen Namens gespeichert.

Reguläre Ausdrücke

Auch die Arbeit mit Suchmustern ist möglich. Die Quelle der Suche ist ein regulärer Ausdruck ('RegEx'), der in unseren Beispielen bisher immer nur durch einzelne Buchstaben gebildet wurde. Da reguläre Ausdrücke ein recht komplexes Thema sind, widmen wir ihnen den nächsten Teil dieser Artikelserie, um danach weitere Möglichkeiten des `sed` im Zusammenhang mit regulären Ausdrücken kennenzulernen.