sed
sed - strom-orientierter Editor zur Bearbeitung von Dateien anhand von Regeln
Beschreibung
- 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.
So funktioniert's
- 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
Dies wird als ein Ausführungszyklus bezeichnet.
- 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.
Installation
Syntax
Optionen
Parameter
Umgebungsvariablen
Exit-Status
Anwendungen
Fehlerbehebung
Konfiguration
Dateien
Sicherheit
Siehe auch
Unterseiten
- 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
RFC
Man-Pages
Info-Pages
Links
Einzelnachweise
Projekt
Weblinks
Testfragen
Testfrage 1
Testfrage 2
Testfrage 3
Testfrage 4
Testfrage 5
TMP
Aufruf
Dateiübergabe
Ausgabe
Kommandoübersicht
Substitutionen
Reguläre Ausdrücke
Beispieltexte
Anweisungen
Zeilen ausgeben
Adressierung
Zeilen löschen
Suchen und Ersetzen
Mehrere Kommandos [-e]
Einfügen [i|a]
Einfügen aus einer Datei [r]
In seltenen Fällen wird ein Text nur in eine einzige Datei eingefügt werden, sonst wäre der Griff zu einem herkömmlichen Editors der effizientere Weg.
Eine Methode ist, den einzusetzenden Text in einer separaten Datei zu erfassen und Sed jene unterzuschieben.
cat ins.txt =========================================== Angabe Bereich von Zeilen =========================================== Dieser Text lässt sich mittels des r-Kommandos einfach an beliebiger Stelle einordnen: sed '8r ins.txt' test.txt 1 Der Aufruf des Stream Editors besitzt immer das Format: 2 3 sed 'Kommando' Dateiname 4 5 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der 6 Eingabedatei es bearbeiten soll.
- Als Adressierung kommen folgende
7 Mechanismen in Frage: 8 =========================================== Angabe Bereich von Zeilen =========================================== 9 Keine Angabe Alle Zeilen 10 Nummer Genau diese Zeile 11 Start, Ende Alle Zeilen von "Start" bis "Ende" 12 $ Symbolisiert die letzte Zeile 13 RegEx Zeilen, die den Regulären Ausdruck enthalten 14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält
Schreiben in eine Datei [w]
Das Ergebnis des Stream Editors lässt sich in einer Datei speichern:
sed -n '/^1/w out.txt' test.txt cat out.txt 10 Nummer Genau diese Zeile 11 Start, Ende Alle Zeilen von "Start" bis "Ende" 12 $ Symbolisiert die letzte Zeile 13 RegEx Zeilen, die den Regulären Ausdruck enthalten 14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält
Änderungen in Datei schreiben und auf Konsole (s//gpw)
The example below has substitution with three flags.
- It substitutes all the occurance of Linux to Linux-Unix and prints the substituted output as well as written the same to the given the file.
sed -n 's/Linux/Linux-Unix/gpw output' thegeekstuff.txt 1. Linux-Unix Sysadmin, Linux-Unix Scripting etc. 4. Storage in Linux-Unix
cat output 1. Linux-Unix Sysadmin, Linux-Unix Scripting etc. 4. Storage in Linux-Unix
Dateien direkt bearbeiten
- Häufig ist es sinnvoll Dateien direkt zu bearbeiten, anstatt sie auf die Standardausgabe zu schreiben.
- Dies ist mit der Option »-i« möglich.
Der folgende Befehl ersetzt alle "Hallo" in der Datei test.txt durch "Hey", ohne eine Ausgabe zu erzeugen.
sed -i"" 's|Hallo|Hey|g' test.txt
- Achtung! Das "" nach -i ist notwendig.
- Mit dieser Option ist es auch sehr einfach möglich mehrere Dateien zu bearbeiten.
Hiermit werden alle Dateien im aktuellen Ordner die mit .txt enden wie gerade beschrieben bearbeitet:
sed -i"" 's|Hallo|Hey|g' *.txt
Dateien ergänzen
Zeile am Dateianfang einfügen
Dies ist auch ohne sed möglich, zum Beispiel mit Hilfe von echo und cat
cat - <<< "Anfang" sed-test.txt > sed-test2.txt echo "Anfang" | cat - sed-test.txt > sed-test2.txt echo "Anfang" > sed-test2.txt; cat sed-test.txt >> sed-test2.txt
Mit Hilfe von sed geht dies eleganter.
sed '1iAnfang' < sed-test.txt > sed-test2.txt * 1=Zeile 1 (explizite Bereichsauswahl) * i=insert-Befehl
Zeile innerhalb des Textes einfügen
Die folgende Anweisung fügt eine neue Zeile vor der vorletzten Zeile ein.
sed '/vorletzte/idies ist die vorvorletzte Zeile' < sed-test.txt > sed-test2.txt * /vorletzte/ = Bereichsauswahl über RE * i=insert-Befehl
Zeile ans Dateiende anhängen
sed '$aEnde' < sed-test.txt > sed-test2.txt * $=letzte Zeile (explizite Bereichsauswahl) * a=append-Befehl
Zeichen am Zeilenanfang einfügen
Das Zeichen "#" soll in allen Zeilen an den Zeilenanfang gesetzt werden.
sed 's/^/#/' < sed-test.txt * s =suchen & ersetzen * /^/ ="Zeilenanfangszeichen" * /#/ = Replace-String
Die Anweisung erscheint auf den ersten Blick nicht ganz logisch.
- Sie ist folgendermaßen zu interpretieren: Ersetze in jeder Zeile das am Zeilenanfang gedachte fiktive "leer-Zeichen" (sozusagen "") durch das #-Zeichen.
Es wird also nicht der Zeilenanfang selbst ersetzt, was ja gar nicht möglich wäre, da es kein Zeilenanfangszeichen analog zum Zeilenendezeichen gibt.
- Einfacher verständlich wird die Anweisung, wenn man ein bestimmtes Wort am Zeilenanfang ersetzen lässt:
sed 's/^Hier/Dort/' < sed-test.txt
- Hier" am Zeilenanfang wird ersetzt durch "Dort"
Beispiel
Das Zeichen "#" soll bei Zeilen, die mit "Hier" beginnen an den Zeilenanfang gesetzt werden.
sed 's/^Hier/#Hier/' < sed-test.txt
Beispiel
Das Zeichen "#" soll in Zeilen, in denen "letzt" vorkommt, an den Zeilenanfang gesetzt werden.
- Dieser Fall unterscheidet sich von den vorigen, weil das "suchen & ersetzen" auf einen bestimmten Bereich beschränkt werden muss.
- Hierzu werden geschweifte Klammern verwendet.
sed '/letzt/{s/^/#/}' < sed-test.txt * /letzt/ =RE; Zeilen, in denen "letzt" vorkommt, werden selektiert * {s...} = "suchen & ersetzen" wird nur in den selektierten Zeilen ausgeführt
Nächste Zeile beabeiten[n]
Soll erst die dem Suchmuster folgende Zeile manipuliert werden, ist das n-Kommando der beste Kandidat:
sed -n '8,${n;s/\(.\{1,\}\)/*\1/p;}' test.txt * 9 Keine Angabe Alle Zeilen *11 $ Symbolisiert die letzte Zeile *13 RegEx Zeilen, die den Regulären Ausdruck enthalten
Die Kommandozeile ist schwer verdaulich...
- aber der Reihe nach:
»-n« | als Kommandozeilenoption besagt, dass die Ausgabe einzig die bearbeiteten Zeilen betreffen soll. |
---|---|
Da jedoch das Flag »s« | sämtliche Ausgaben »verschluckt«, muss »p« am Ende bemüht werden. |
»8,$« | adressiert die Zeilen 8 bis zum Ende der Datei.
|
»n« | als Substitutionskommando bewirkt, dass die nächste Zeile bearbeitet wird - Zeile 9.
|
».\{1,\}« | meint »mindestens ein (\{1,\}) beliebiges (.) Zeichen. |
Da jede Zeile im Beispiel zumindest die Zeilenummer umfasst und das komplette Muster mit »\(...\)« gespeichert wird, erscheint die gesamte Zeile mit vorangestelltem Stern (*\1) in der Ausgabe... | |
Sed fährt mit der folgenden Zeile (10) fort, die (wegen Flag »n«) übersprungen wird. |
Zeichen tauschen [y]
- Einzelne Zeichen lassen sich durch andere einzelne Zeichen ersetzen.
- Das Zeichen an Position x der Liste zu ersetzender Zeichen wird in das Zeichen an Position x der Liste der neuen Zeichen transformatiert.
Damit ist klar, dass beide Zeichenlisten dieselbe Länge besitzen müssen:
sed 'y/abcdefghijklmnopqrstuvwxyz/zyxwvutsrqponmlkjihgfedcba/' test.txt 1 Dvi Afuifu wvh Sgivzn Ewrglih yvhrgag rnnvi wzh Flinzg: 2 3 hvw 'Klnnzmwl' Dzgvrmznv 4 5 Dzyvr pzmm wvn Klnnzmwl nrgtvgvrog dviwvm, dvoxsv Zvrovm wvi 6 Ermtzyvwzgvr vh yvziyvrgvm hloo.
- Aoh Awivhhrvifmt plnnvm ulotvmwv
7 Mvxszmrhnvm rm Fiztv: 8 9 Kvrmv Amtzyv Aoov Zvrovm 10 Nfnnvi Gvmzf wrvhv Zvrov 11 Sgzig, Emwv Aoov Zvrovm elm "Sgzig" yrh "Emwv" 12 $ Sbnylorhrvig wrv ovgagv Zvrov 13 RvtEc Zvrovm, wrv wvm Rvtfo/auml;ivm Afhwifxp vmgszogvm 14 1, RvtEc Vlm Zvrov 1 yrh afi vihgvm Zvrov, wrv RvtEc vmgsäog
Sed vorzeitig beenden [q]
Manchmal ist es sinnvoll, den Stream Editor vorzeitig zu beenden:
sed '3q' test.txt 1 Der Aufruf des Stream Editors besitzt immer das Format: 2 3 sed 'Kommando' Dateiname
sed -n '/sed/{p;q;}' test.txt 3 sed 'Kommando' Dateiname
Zeilentausch [h|g|G|x ]
- Die aktuell bearbeitete Zeile hält der Sed in einem Zwischenspeicher und bearbeitet sie in diesem »Pattern Space«.
- Hat der Editor seine Arbeit beendet, gibt er die Zeile aus und lädt die folgende Zeile der Eingabedatei in den Zwischenspeicher.
h | Mit dem Kommando »h« kann der aktuelle Zwischenspeicher in einen Puffer gesichert werden (»holding buffer«). |
---|---|
G | Das Kommando »G« fügt den Inhalt dieses Sicherungspuffers hinter der aktuell bearbeiteten Zeile ein. |
g | »g« ersetzt die aktuelle Zeile durch den Inhalt des Sicherungspuffers. |
x | Den Inhalt der beiden Puffer vertauscht das Kommando »x«. |
Beispiel 1
sed -e '/sed/{h;d;}' -e '4G' -e '4q' test.txt 1 Der Aufruf des Stream Editors besitzt immer das Format: 2 4 3 sed 'Kommando' Dateiname sed -e '/sed/{h;d;}' -e '4g' -e '5q' test.txt 1 Der Aufruf des Stream Editors besitzt immer das Format: 2 3 sed 'Kommando' Dateiname 5 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der
Erklärung
- Das erste Kommando »-e '/sed/{h;d;}'« in teilt dem Editor mit, die Zeile, die sed enthält, zuerst in den Zwischenspeicher zu sichern und nachfolgend zu löschen.
- Das zweite Kommando vollzieht das Einfügen des Inhalts des Puffers. »-e '4G'« fügt nach der 4.Zeile ein (Achtung: die gelöschte Zeile wird mitgezählt!)»-e '4g'« ersetzt die 4.Zeile.
- Das letzte Kommando »-e '4q'« beendet die Arbeit des Editors nach der 4.
- Zeile.
Beispiel 2
sed -e '/Aufruf/h' -e '/Angabe/x' -e '$G' test.txt 1 Der Aufruf des Stream Editors besitzt immer das Format: 2 3 sed 'Kommando' Dateiname 4 5 Dabei kann dem Kommando mitgeteilt werden, welche Zeilen der 6 Eingabedatei es bearbeiten soll.
- Als Adressierung kommen folgende
7 Mechanismen in Frage: 8 1 Der Aufruf des Stream Editors besitzt immer das Format: 10 Nummer Genau diese Zeile 11 Start, Ende Alle Zeilen von "Start" bis "Ende" 12 $ Symbolisiert die letzte Zeile 13 RegEx Zeilen, die den Regulären Ausdruck enthalten 14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält 9 Keine Angabe Alle Zeilen
Erklärung
- Enthält eine Zeile das Muster »Aufruf«, wird sie im Zwischenpuffer abgelegt.
- Steht in einer Zeile »Angabe«, so wird diese Zeile mit dem Inhalt des Zwischenpuffers vertauscht.
- Der Inhalt des Zwischenpuffers wird hinter der letzten Zeile eingefügt.
Sed-Skripte
Kompliziertere und häufig benötigte Sed-Aufrufe schreibt man besser in eine Datei.
- Der Aufruf von Sed sieht dann wie folgt aus:
sed -f <Skript_Datei> <zu_bearbeitende_Datei>
Beim Schreiben eines Skripts gelten folgende Regeln: * Beginnt eine Zeile mit einem Doppelkreuz #, so handelt es sich um einen Kommentar
- Vor und nach einem Kommando dürfen keine Leerzeichen, Tabulatoren...
- stehen
- Mehrere Kommandos auf einer Zeile, sind sie durch Semikola voneinander zu trennen
Der Stream Editor wird das gesamte Skript auf jede Zeile der Eingabedatei anwenden.
Als Beispiel dient ein Skript, dass alle deutschen Umlaute in der Eingabedatei umschreibt.
cat umlaut ## Ersetzen Umlaute s/ä/\ae/g s/ü/\ue/g s/ö/\oe/g s/Ä/\ae/g s/Ü/\Ue/g s/Ö/\Oe/g s/ß/\ss/g
Das Anwendungsbeispiel demonstriert die Möglichkeit der Kopplung von Kommandozeilenbefehlen und einem Skript:
sed -e '1,12d' -f umlaut test.txt 13 RegEx Zeilen, die den Regulären Ausdruck enthalten 14 1, RegEx Von Zeile 1 bis zur ersten Zeile, die RegEx enthält