sed
sed - Stromeditor zum Filtern und Umwandeln von Text
Beschreibung
sed steht für Stream EDitor und ist ein Unix-Werkzeug, mit dem Text-Datenströme bearbeitet werden können. Der Datenstrom kann auch aus einer Datei gelesen werden. Im Gegensatz zu einem Texteditor wird die Ursprungsdatei aber nicht verändert.
Im Gegensatz zu einem interaktiven Texteditor, wie etwa dem vi, wird sed
mittels eines Skripts gesteuert.
Der sed
-Befehlssatz orientiert sich an jenem des zeilenorientierten Texteditors ed. Dabei werden für die Text-Durchmusterung laut der POSIX-Spezifikation eine bestimmte Abart der Regular Expressions, sogenannte (POSIX-) Basic Regular Expressions (BRE) verwendet.[1] Die GNU-Implementation verwendet allerdings GNU-BREs, die von POSIX-BREs geringfügig abweichen.
Auch wenn der Sprachumfang von sed
ziemlich limitiert und spezialisiert erscheint, so handelt es sich doch um eine Turing-vollständige Sprache. Beweisen kann man die Turing-Vollständigkeit, indem man eine Turingmaschine mittels sed
programmiert[2][3] oder indem man mit sed einen Interpreter für eine andere, Turing-vollständige Sprache schreibt.[4]
Folglich konnten und wurden sogar Spiele wie Sokoban oder Arkanoid und andere anspruchsvolle Programme wie Debugger mit sed geschrieben.[5]
- Sed ist ein Stromeditor (stream editor)
- Ein Stromeditor wird für grundlegende Texttransformationen auf einen Eingabestrom (einer Datei oder aus einer Verarbeitungskette) verwandt.
- Obwohl in einigen Aspekten ähnlich zu einem Editor, der Bearbeitungen nach Skript erlaubt (wie Ed), führt Sed nur einen Durchlauf über die Eingabe(n) durch und ist somit effizienter.
- Allerdings ist es die Fähigkeit von Sed, Text in einer Verarbeitungskette zu filtern, die ihn besonders gegenüber anderen Arten von Editoren auszeichnet.
- Da es ein "nicht-interaktives" Programm ist, kann es, falls gewünscht, zur Automatisierung der Bearbeitung verwendet werden.
- Der Name sed ist eine Abkürzung für stream editor, und das Dienstprogramm leitet viele seiner Befehle vom ed line-editor ab (ed war der erste UNIX-Texteditor).
- So können Sie mehrere Dateien bearbeiten oder gängige Bearbeitungsvorgänge durchführen, ohne jemals vi oder emacs öffnen zu müssen.
- sed liest aus einer Datei oder von der Standardeingabe und gibt auf der Standardausgabe aus.
- sed hat zwei Puffer, die Musterpuffer und Haltepuffer genannt werden.
- Beide sind anfangs leer.
- Funktionsweise
- Geben Sie den Musterpuffer auf stdout aus.
- Der Stream-Editor ist kein herkömmlicher Editor wie Vi oder Emacs.
- Sed arbeitet nicht interaktiv, sondern wird über Kommandozeilenoptionen oder ein Skript gesteuert.
- Sed verändert nicht das Original, sondern schreibt das Ergebnis auf die Standardausgabe.
- Sed lädt die aktuell betrachtete Zeile in einen temporären Puffer - im Folgenden als Arbeitspuffer bezeichnet.
Unix Sed Arbeitsmethodik
- Ausführungszyklus
- Der Zyklus wird fortgesetzt, bis das Ende der Datei/Eingabe erreicht ist # Lesen einer ganzen Zeile aus stdin/file
- Entfernt alle nachstehenden Zeilenumbrüche
- Legt die Zeile in seinen Musterpuffer
- Ändert den Musterpuffer entsprechend den übergebenen Befehlen
Reguläre Ausdrücke
- POSIX.2-BREs sollten unterstützt werden
- Dies erfolgt allerdings aus Leistungsgründen nicht vollständig.
- Die Sequenz \n in einem regulären Ausdruck passt auf das Zeilenumbruchzeichen und ähnliches gilt für \a, \t und andere Sequenzen.
- Die Option -E schaltet auf die Verwendung von erweiterten regulären Ausdrücken um; sie wurde seit Jahren in GNU Sed unterstützt und ist jetzt in POSIX enthalten.
Installation
# apt install sed
Aufruf
$ sed [-V] [--version] [--help] [-n] [--quiet] [--silent] [-l N] [--line-length=N] [-u] [--unbuffered] [-E] [-r] [--regexp-extended] [-e Skript] [--expression=script] [-f Skriptdatei] [--file=Skriptdatei] [script-if-no-other-script] [Datei …]
Optionen
Unix | GNU | Beschreibung |
---|---|---|
-n | --quiet, --silent | unterdrückt die Ausgabe des Musterbereichs |
--debug | Kommentiert die Programmausführung | |
-e Skript | --expression=Skript | Fügt das Skript zu den auszuführenden Befehlen hinzu |
-f Skriptdatei | --file=Skriptdatei | Fügt den Inhalt der Skriptdatei zu den auszuführenden Befehlen hinzu |
--follow-symlinks | Symbolischen Links bei der Bearbeitung an Ort und Stelle folgen | |
-i[ENDUNG] | --in-place[=ENDUNG] | Dateien an Ort und Stelle bearbeiten (erstellt Sicherung, falls ENDUNG angegeben) |
-l N | --line-length=N | Gibt die gewünschte Zeilenumbruchlänge für den Befehl »l« an |
--posix | Deaktiviert alle GNU-Erweiterungen | |
-E, -r | --regexp-extended | Verwendet erweiterte reguläre Ausdrücke in dem Skript (für Portabilität verwenden Sie POSIX -E) |
-s | --separate | Betrachtet Dateien getrennt statt als einzigen, kontinuierlichen langen Strom |
--sandbox | Arbeitet im »Sandbox«-Modus (deaktiviert e/r/w-Befehle) | |
-u | --unbuffered | Lädt minimale Datenmenge aus den Eingabedateien und schreibt die Ausgabepuffer öfter |
-z | --null-data | Zeilen durch NUL-Zeichen trennen |
--help | zeigt Hilfeinformationen an und beendet das Programm | |
--version | gibt Versionsinformationen aus und beendet das Programm |
Befehle
Rückgabewert
Anwendungen
Arbeitsweise
sed
kann sowohl innerhalb einer Pipeline als auch auf Dateien arbeiten. Ausgaben erfolgen grundsätzlich auf <stdout>
, Fehlermeldungen auf <stderr>
. Der typische Aufruf sieht deshalb so aus:
sed 'Anweisung1 Anweisung2 … AnweisungN' Eingabedatei > Ausgabedatei <stream> | sed 'Anweisung1 Anweisung2 … AnweisungN' | <stream>
sed
liest eine Eingabedatei (oder einen input stream
auf <stdin>
) zeilenweise ein. Diese Eingangsdaten landen zunächst im sogenannten Pattern Space. Auf diesem Pattern Space wird nacheinander jede Anweisung des vorgegebenen Programmes ausgeführt. Jede dieser Anweisungen kann dabei den Pattern Space verändern, folgende Anweisungen werden dann auf dem jeweiligen Ergebnis der letzten Anweisung ausgeführt. Führt eine dieser Veränderungen zu einem Nulltext, so wird die Verarbeitung an dieser Stelle abgebrochen und die Anweisungsliste mit der nächsten Eingabezeile wieder von vorne begonnen. Ansonsten wird das Ergebnis der letzten Anweisung auf <stdout>
ausgegeben und die Anweisungsliste ebenfalls mit der nächsten Eingabezeile wieder begonnen.
Siehe auch
- awk(1)
- ed(1)
- grep(1)
- tr(1)
- perlre(1)
- sed.info
- Sed-FAQ http://sed.sf.net/grabbag/tutorials/sedfaq.txt
- http://sed.sf.net/grabbag/
- Sed
- Sed/Adressierung
- Sed/Anweisungen
- Sed/Aufruf
- Sed/Ausgabe
- Sed/Befehle
- Sed/Beispieltext
- Sed/Dateien direkt bearbeiten
- Sed/Dateien ergänzen
- Sed/Dateiübergabe
- Sed/Einfügen
- Sed/Einfügen aus einer Datei
- Sed/Kommandos
- Sed/Mehrere Kommandos
- Sed/Nächste Zeile beabeiten
- Sed/Regular Expressions
- Sed/Schreiben in eine Datei
- Sed/Sed-Skripte
- Sed/Sed vorzeitig beenden
- Sed/Substitutionen
- Sed/Suchen und Ersetzen
- Sed/Zeichen tauschen
- Sed/Zeilen ausgeben
- Sed/Zeilen löschen
- Sed/Zeilentausch
Dokumentation
Man-Page
Info-Pages
$ info sed
Links
Projekt
Weblinks
- https://de.wikipedia.org/wiki/Sed_(Unix)
- sed-Projektseite auf sourceforge (englisch)
- seder’s grab bag (englisch)
- sed für Windows mit funktionierender -i Option (ZIP; 50 kB)
- Ausführliches Tutorium (deutsch)