Tipp: Stream EDitor - 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 einen eigenen Artikel.