Sed (Unix)
aus Wikipedia, der freien Enzyklopädie
Der korrekte Titel dieses Artikels lautet „sed (Unix)“. Diese Schreibweise ist aufgrund technischer Einschränkungen nicht möglich. |
sed steht für Stream EDitor und ist ein bekanntes Unix-Werkzeug, mit dem Texte geändert werden können. sed ermöglicht die automatisierte Manipulation per Kommandozeile – im Gegensatz etwa zu einem interaktiven Texteditor wie dem vi.
Die sed-Befehle orientieren sich teilweise an denen des zeilenorientierten Texteditors ed.
Inhaltsverzeichnis |
[Bearbeiten] Arbeitsweise
sed liest eine Eingabedatei oder einen Textstrom (Stream) Zeile für Zeile und gibt jede Zeile entsprechend vorgegebener Regeln verändert wieder als Stream aus. Die Ausgabe kann dann wiederum in eine Datei geschrieben werden.
Um die Ausgabe eines anderen Programms an sed umzuleiten und diese manipulieren zu lassen, bedient man sich sogenannter Pipes. Am häufigsten werden jedoch die Inhalte von Textdateien manipuliert. Diese werden sed einfach als Parameter übergeben, siehe dazu die folgenden Beispiele.
[Bearbeiten] Typische Anwendungsbeispiele
Eine typische Anwendung ist das Ersetzen von Ausdrücken:
sed 's/alt/neu/g' Eingabedatei >Ausgabedatei
Die Veränderungsregel 's/alt/neu/g' besagt, dass in jeder Zeile der Eingabedatei die Vorkommen des Regulären Ausdrucks 'alt' durch die Zeichenfolge 'neu' zu ersetzen ist.
Das führende 's' ist ein sed-Befehl. Er bedeutet, dass eine Zeichen-Ersetzung (substitution) stattfinden soll.
Das 'g' am Ende gibt vor, dass die Veränderung global, d. h. für alle Vorkommen in jeder Zeile, vorgenommen werden soll.
Durch den Operator > wird die Ausgabe des Programms, die normalerweise auf den Standard Output Stream (Stdout) erfolgt, in eine Datei geschrieben. Dies erfolgt nicht durch sed selbst, sondern durch den Kommandozeileninterpreter; diese Operation ist prinzipiell bei jedem Programm möglich, das auf Stdout Daten ausgibt.
Auch das Ersetzen von mehrfachen Leerzeichen durch ein einziges ist möglich:
sed 's/ \+/ /g' Eingabedatei >Ausgabedatei
In diesem Falle steht das '\+' für ein- oder mehrmals das vorherige Zeichen, womit nicht nur ein Leerzeichen, sondern auch mehrere hintereinander ersetzt werden.
Falls in der alten oder der neuen Zeichenfolge bereits ein '/' vorkommt, behilft man sich statt des '/' in folgendem Beispiel mit einem anderen Sonderzeichen:
sed 's!/tmp/!!'
ersetzt alle Vorkommen von '/tmp/' durch nichts (löscht diese also aus dem Text), daher die zwei '!' direkt nebeneinander.
Obwohl der 's'-Befehl der meistbenutzte Befehl ist, gibt es weitere nützliche Befehle. So gibt es den Befehl 'd', der eine Zeile löscht. Durch
sed 'd' Eingabedatei >Ausgabedatei
würde allerdings immer eine leere Ausgabedatei entstehen. Das wäre recht sinnlos. Man kann deshalb allgemein Befehle nur auf solche Zeilen anwenden, die einen bestimmten Text enthalten.
sed '/fehler/d' Eingabedatei >Ausgabedatei
Hier werden alle Zeilen, die den Text zwischen den Schrägstrichen enthalten (im Beispiel fehler) entfernt.
So kann man sed auch (anstatt grep) dazu benutzen, um alle Zeilen einer Datei auszudrucken, die einem bestimmten Muster entsprechen:
sed -n '/einMuster/p' Eingabedatei
Die Option '-n' gibt dabei an, dass sed nichts ausgeben soll, wenn es nicht durch den 'p'-Befehl explizit gefordert wird. Ohne diese kopiert sed automatisch jede Zeile der Eingabedatei in die Ausgabedatei (in diesem Fall, da nicht explizit eine Datei angegeben wurde, das aktuelle Terminal).
Löschen aller Zeilen, die höchstens Leerzeichen beinhalten:
sed '/^ *$/d' Eingabedatei >Ausgabedatei
Der Befehl d bedeutet, dass die betreffende Zeile gelöscht werden soll, ^ steht für den Zeilenanfang, $ für das Zeilenende. Das Leerzeichen und der darauffolgende Asterisk (*) bedeuten beliebig viele (auch kein) Leerzeichen.
Diese Beispiele zeigen einen typischen Einsatzbereich von sed: Einfache Aufgaben, die durch kurze Regeln beschreibbar sind.
Diese Regeln erlauben weiterhin den Einsatz Regulärer Ausdrücke, die (u. a.) durch sed bekannt geworden sind.
[Bearbeiten] Exotische Beispiele
Weiter kann man die Regeln durch eine einfache Skriptsprache auch zu größeren Programmen zusammenfassen. Seds Programmiersprache kennt zwar keine Variablen und hat nur einfache Vergleichsmöglichkeiten und einen Goto-Befehl; sie ist aber trotzdem turing-äquivalent. "Beweisen" kann man die Turing-Äquivalenz beispielsweise, indem man eine Turing-Maschine mittels sed "baut" [1] oder indem man mit sed einen Interpreter für eine andere, turing-vollständige Sprache schreibt [2].
Trotz der eingeschränkten Möglichkeiten wurden sogar Spiele wie sokoban oder arkanoid und andere anspruchsvolle Programme wie debugger mit sed geschrieben. [3]
Für komplexere Aufgaben werden gewöhnlich awk oder Perl benutzt.
Das GNU-Projekt macht eine Version von sed als Freie Software auf jedem Betriebssystem verfügbar, das über einen C-Compiler verfügt.
[Bearbeiten] Weblinks
- sed-Projektseite auf sourceforge (englisch)
- sed-Tutorial
- seder's grab bag (englisch)
- Sammlung zu Fragen (FAQ) rund um sed, inklusive Skripte (englisch)
[Bearbeiten] Quellen
- ↑ TUBA Freiberg: Turing sed
- ↑ Brainfuck mit sed [1] (engl.)
- ↑ Liste verschiedener sed-Skripte (engl.)