Der Befehl sed
Bei sed handelt es sich um einen sogenannten "stream editor", welcher verwendet wird, um grundlegende Texttransformationen an einem Eingabestrom vorzunehmen. Zwar ähnelt sed in mancher Hinsicht einem Editor, der skriptgesteuerte Bearbeitungen erlaubt (z.B. ed), so arbeitet er lediglich mit einem Durchlauf des Eingabestroms - dies macht sed effizienter. Insbesondere die Fähigkeit, Text in einer Pipeline zu filtern, hebt sed jedoch von anderen Arten von Editoren ab.
In diesem Beitrag werden Sie zunächst die grundlegende Anwendung des Befehls kennenlernen. Anschließend folgen die wichtigsten Optionen des Befehls sowie einige Grundlagen zu sed-Skripten.
Allgemeine Syntax
Die allgemeine Syntax des Befehls sed lautet folgendermaßen:
sed [Optionen] [Skript] [Datei]
Wird keine Datei in den Argumenten des Befehls spezifiziert, oder wurde anstelle eines Dateinamens "-" angegeben, so filtert sed den Inhalt des Standard-Input stdin. Ausgaben werden standardmäßig in den Standard-Output stdout geschrieben - siehe die Option -i für In-Place Bearbeitung. Weiterhin wird standardmäßig die komplette verarbeitete Eingabe, mit Ausnahme solcher Zeilen die von Kommandos wie "d" bearbeitet oder gelöscht wurden, ausgegeben. Die Option -n kann jedoch verwendet werden, um die Ausgabe zu unterdrücken - mit dem Kommando "p" können dann nur spezifische Zeilen ausgegeben werden.
sed behandelt standardmäßig den ersten nicht-Options-Parameter als Skript und alle folgenden nicht-Options-Parameter als Eingabedateien. Werden mehrere Dateien angegeben, so werden diese von sed wie ein langer Eingabestrom behandelt.
Wichtige Optionen
Im Folgenden werden Ihnen zunächst einige der wichtigsten Optionen des Befehls sed vorgestellt.
-n - Automatische Ausgabe unterdrücken
Mithilfe der Option -n wird die standardmäßige Ausgabe der verarbeiteten Eingabe am Ende eines Skript-Durchlaufs deaktiviert. sed gibt dann nur etwas aus, wenn es explizit mit dem Kommando "p" dazu aufgefordert wird:
sed -n [Skript] [Datei]
-e - Skript hinzufügen
Die im übergebenen Skript enthaltenen Kommandos werden an die Menge der Kommandos, die während der Eingabeverarbeitung ausgeführt werden sollen, angehängt:
sed -e [Skript] [Skript] [Datei]
-f - Skriptdatei hinzufügen
Die im Inhalt der übergebenen Datei enthaltenen Kommandos werden an die Menge der Kommandos, die während der Eingabeverarbeitung ausgeführt werden sollen, angehängt:
sed -f [Skriptdatei] [Skript] [Datei]
-i - In-Place-Bearbeitung
Mit der Option -i können Sie die In-Place-Bearbeitung aktivieren. sed erzeugt hierbei eine temporäre Datei und schreibt seine Ausgaben dorthin. Wenn das Ende der Eingabedatei erreicht ist, wird die temporäre Datei in den Namen der ursprünglichen Eingabedatei umbenannt. Optional kann ein Suffix übergeben werden, welcher vor der Umbenennung der temporären Datei verwendet wird, um die Eingabedatei umzubenennen - so entsteht eine Sicherungskopie der Originaldatei. Sind im Suffix keine Sterne "*" enthalten, so wird er an das Ende des aktuellen Dateinamen angehängt. Sind jedoch ein oder mehrere Sterne "*" enthalten, so wird stattdessen jedes Stern-Vorkommnis durch den Namen der aktuellen Datei ausgetauscht. Auf diesem Weg wird es möglich, einen Präfix voranzustellen, oder Sicherheitskopien in anderen (bereits existierenden) Verzeichnissen abzulegen. Die Sicherungskopie wird erstellt, unabhängig davon, ob tatsächlich eine Änderung vorgenommen wurde. Wird kein Suffix übergeben, so wird die Originaldatei ohne Erstellung einer Sicherheitskopie überschrieben.
sed -i[Suffix] [Skript] [Datei]
Die Option -s wird impliziert.
Bei Verwendung der Option -i in Kombination mit der Option -n sollten Sie besondere Vorsicht walten lassen, da die Ausgabedatei bei fehlerhafter Anwendung leer sein könnte.
-l - Zeilenumbruchlänge spezifizieren
Die Option -l wird verwendet, um die Standardlänge des Zeilenumbruchs für das Kommando "l" zu spezifizieren. Während eine Länge von 0 bedeutet, dass lange Zeilen nie umgebrochen werden, wird bei nicht spezifizierter Zeilenumbruchlänge standardmäßig der Wert 70 verwendet.
sed -l [Länge] [Skript] [Datei]
--posix - Keine GNU-Erweiterungen
Im Vergleich zum POSIX-sed beinhaltet GNU-sed einige Erweiterungen wie etwa zusätzliche Kommandos - diese können mithilfe der Option --posix deaktiviert werden, um die Entwicklung portabler Skripte zu vereinfachen:
sed --posix [Skript] [Datei]
-E - Erweiterte reguläre Ausdrücke
Anstelle grundlegender regulärer Ausdrücke werden bei Verwendung der Option -E erweiterte reguläre Ausdrücke verwendet. Es handelt sich um solche regulären Ausdrücke, wie auch der Befehl egrep sie akzeptiert:
sed -E [Skript] [Datei]
-s - Dateien einzeln behandeln
Das Standard-Verhalten, bei welchem mehrere spezifizierte Dateien wie ein langer Eingabestrom behandelt werden, kann mit der Option -s - welche eine GNU-Erweiterung darstellt - umgestellt werden. Dateien werden dann einzeln behandelt. Bereichsadressen dürfen hierbei nicht Dateigrenzen überschreiten - zudem sind Zeilennummern relativ zum Anfang- und das Sonderzeichen "$" verweist jeweils auf das Ende jeder zu verarbeitenden Datei.
sed -s [Skript] [Datei]
--sandbox - Sandbox-Modus
Im Sandbox-Modus werden Skripte, die die Kommandos "e", "w" oder "r" beinhalten, vor der Ausführung abgebrochen. Der Modus stellt sicher, dass sed nur mit den auf der Befehlszeile angegebenen Eingabedateien arbeitet und keine externen Programme ausführen kann.
sed --sandbox [Skript] [Datei]
-u - Ein- und Ausgabe minimal puffern
Wird die Option -u verwendet, so puffert sed sowohl die Eingabe als auch die Ausgabe so minimal wie möglich. Die Option ist insbesondere dann nützlich, wenn die Eingabe von einem Befehl wie "tail -f" stammt und ihre transformierte Form so schnell wie möglich angezeigt werden soll.
sed -u [Skript] [Datei]
-z - Null-Terminierung verwenden
Bei Verwendung der Option -z werden Zeilen nicht mit dem standardmäßigen Zeilenumbruch, sondern mit ASCII-NUL terminiert. Die Option lässt sich gut mit Befehlen wie "sort -z" oder "find -print0" kombinieren, um beliebige Dateinamen zu verarbeiten.
sed -z [Skript] [Datei]
sed-Skripte
sed-Skripte bestehen aus einem oder mehreren sed-Kommandos, die entweder einer oder mehreren -e und -f Optionen, oder als erstes nicht-Options Argument übergeben werden, wenn keine der Optionen in Verwendung ist. Mehrere in einem Skript oder eine Skript-Datei befindliche sed-Kommandos werden dabei mithilfe von Semikola ";" oder Linefeeds (ASCII 10) getrennt.
Ein sed-Kommando hat die folgende Syntax:
[Adresse]X[Optionen]
X stellt hierbei ein aus einem Buchstaben bestehendes sed-Kommando dar. "[Adresse]" ist eine optionale Zeilenangabe, wobei es sich um eine einzelne Zeilennummer, einen regulären Ausdruck oder eine Zeilen-Bereichsangabe handeln kann. Bei Angabe von "[Adresse]" wird das Kommando X ausschließlich auf den übereinstimmenden Zeilen ausgeführt wird. Schließlich verwenden einige sed-Kommandos zusätzliche "[Optionen]".
Aufgrund ihrer Syntax können die sed-Kommandos a, c und i nicht von Semikola ";" gefolgt werden. Sie sollten aus diesem Grund mit Linefeeds terminiert, oder an das Ende eines Skripts bzw. einer Skript-Datei gestellt werden.
Während sed eine Datei zeilenweise liest, werden die jeweils eingelesenen Zeilen temporär in den sogenannten Pattern-Space geladen. Dieses Verhalten ist wichtig für das Verständnis einiger sed-Kommandos, von denen im Folgenden nun einige der Wichtigsten vorgestellt werden:
a - Text an Zeilenende anhängen
Das Kommando "a" wird verwendet, um eine mit "[Text]" spezifizierte Zeichenkette an das Ende einer Zeile anzuhängen:
a [Text]
c - Zeilen mit Text ersetzen
Wenn Sie Zeilen mit einer bestimmten Zeichenkette "[Text]" ersetzen möchten, verwenden Sie dazu das Kommando "c":
c [Text]
d - Pattern-Space löschen
Mit dem Kommando "d" kann der Pattern-Space gelöscht werden. sed setzt sofort mit dem nächsten Zyklus fort.
d
g - Pattern-Space mit "Hold" ersetzen
Mithilfe des Kommandos "g" wird der Pattern-Space mit dem Inhalt des sogenannten Hold-Space ersetzt:
g
G - "Hold" an Pattern-Space anhängen
Das Kommando hängt einen Linefeed sowie darauffolgend die Inhalte des Hold-Space an den Pattern-Space an.
G
h - "Hold" mit Pattern-Space ersetzen
Ersetzt die Inhalte des Hold-Space mit den Inhalten des Pattern-Space.
h
H - Pattern-Space an "Hold" anhängen
Hängt einen Linefeed und darauffolgend die Inhalte des Pattern-Space an das Ende des Hold-Space an.
H
i - Text vor Zeile einfügen
Mit des Kommandos "i" kann eine angegebene Zeichenkette "[Text]" vor einer Zeile eingefügt werden:
i [Text]
n - Mit nächster Zeile fortfahren
Wenn die automatische Ausgabe nicht deaktiviert wurde, wird mit diesem Kommando der Pattern-Space. Anschließend wird, unabhängig von der automatischen Ausgabe, der Inhalt des Pattern-Space mit der nächsten Eingabezeile ersetzt. Wenn keine weiteren Eingaben vorliegen, wird sed ohne Verarbeitung weiterer Kommandos beendet.
n
N - Mit nächster Zeile fortfahren (LF)
Fügt einen Linefeed sowie anschließend die nächste Eingabezeile an das Ende des Pattern-Space an. Wenn keine weiteren Eingaben verfügbar sind, wird sed ohne Verarbeitung weiterer Kommandos beendet.
N
p - Pattern-Space ausgeben
Das Kommando "p" gibt den Inhalt des Pattern-Space aus.
p
P - Pattern-Space bis LF ausgeben
Mithilfe des Kommando "P" kann der Pattern-Space bis zum ersten Linefeed ausgegeben werden.
P
q - Exit
Das Kommando "q" beendet sed mit dem angegebenen Exit-Status, wobei die Inhalte des Pattern-Space zuvor ausgegeben werden. Es werden keine weiteren Kommandos oder Eingaben verarbeitet.
q[Exit-Status]
Q - Exit ohne Ausgabe
Das Kommando "Q" funktioniert weitgehend analog wie "q", gibt jedoch die Inhalte des Pattern-Space vor der Beendigung nicht aus.
Q[Exit-Status]
s/regexp/replacement/[flags]
Dieses Kommando wird verwendet, um den angegeben regulären Ausdruck ("regexp") mit dem Inhalt des Pattern-Space zu vergleichen und übereinstimmende Zeichenketten im Pattern-Space mit der Zeichenkette "replacement" zu ersetzen. (Substitution) Standardmäßig wird nur die erste Übereinstimmung ersetzt.
Die Zeichenkette "replacement" kann Referenzen im Format "\n" enthalten, die jeweils die Anteile des Match referenzieren, die zwischen dem n-ten "\(" und seinem zugehörigen "\)" (sogenannten Capture-Groups) liegen, wobei "n" eine Ziffer 0-9 ist. Weiterhin dürfen im "replacement" auch nicht-maskierte "&"-Zeichen enthalten sein, die dann den gesamten übereinstimmenden Anteil des Pattern-Space referenzieren.
Die "/"-Zeichen können innerhalb eines beliebigen s-Kommandos einheitlich durch ein einzelnes beliebiges anderes Zeichen ersetzt werden. In den Zeichenketten "regexp" und "replacement" kann das "/"-Zeichen, oder ein anderes anstelle dessen verwendetes Zeichen, nur verwendet werden, wenn ihm ein "\"-Zeichen vorangestellt wird.
s/[regexp]/[replacement]/[flags]
Das s-Kommando kann optional von einem oder mehreren Flags gefolgt werden:
Flag | Funktion |
---|---|
g | Die Substitution wird auf allen Übereinstimmungen vorgenommen. |
[Nummer] | Nur die n-te Übereinstimmung wird substituiert. Im POSIX-Standard wird kein Verhalten im Falle der Kombination mit dem Flag "g" spezifiziert. Beim GNU-sed werden alle Übereinstimmungen vor der n-ten ignoriert und alle darauffolgenden substituiert. |
p | Wenn die Substitution durchgeführt wurde, wird der neue Pattern-Space ausgegeben. |
w [Dateiname] | Wenn die Substitution durchgeführt wurde, wird der neue Pattern-Space in die angegebene Datei geschrieben. (GNU-Erweiterung) |
e | Erlaubt es die Eingabe eines Shell-Befehls in den Pattern-Space zu leiten. Wenn eine Substitution durchgeführt wurde, wird der Befehl aus dem Pattern-Space ausgeführt und der Pattern-Space mit der jeweiligen Ausgabe ersetzt. Ein nachfolgender Zeilenumbruch wird unterdrückt. Wenn der auszuführende Befehl ein NUL-Zeichen enthält, sind die Ergebnisse undefiniert. (GNU-Erweiterung) |
i | Das "i"-Flag führt dazu, dass sed die Groß und Kleinschreibung ignoriert (case-insensitive). (GNU-Erweiterung) |
m | Das "m"-Flag führt dazu, dass sed im Mehrzeilen-Modus nach Übereinstimmungen sucht. (GNU-Erweiterung) |
x - "Hold" / Pattern-Space tauschen
Mithilfe des Kommando "x" lassen sich die Inhalte von Hold- und Pattern-Space tauschen.
x
z - Pattern-Space leeren
Dieses Kommando leert den Inhalt des Pattern-Space.
z
# - Kommentar
Mit "#" wird ein Kommentar eingeleitet, welcher bis zum Ende der aktuellen Zeile bzw. bis zum nächsten Linefeed reicht.
#[Kommentar]
Exit-Status
Die folgenden Exit-Status werden von sed zurückgegeben:
Operator | Funktion |
---|---|
0 | Ausführung erfolgreich |
1 | Entweder ungültiges Kommando, ungültige Syntax, ungültiger regulärer Ausdruck oder ein GNU-Erweiterungsbefehl, der mit --posix verwendet wurde |
2 | Eine oder mehrere der auf auf der Befehlszeile angegebenen Eingabedateien konnte nicht geöffnet wird |
4 | Es ist ein I/O- oder schwerwiegender Verarbeitungsfehler aufgetreten, GNU sed bricht sofort ab |
Abonniere JETZT unseren Newsletter!
Verpasse nie wieder neue Beiträge und exklusive Insider-Only-Inhalte!