(stream editor)
sed ist ein nicht interaktiver, zeilenorientierter Editor mit ähnlichem Funktionsumfang wie der auch zeilenorientierte, aber interaktive ed.
sed eignet sich besonders, um
mehrere globale Editierfunktionen effizient in einem Schritt durchzuführen,
die Ausgabe eines Kommandos über eine Pipeline auf einfache Weise zu editieren,
eine Folge von Editierkommandos anzuwenden, die für die interaktive Eingabe zu kompliziert ist.
sed liest Dateien sequentiell, bearbeitet die eingelesenen Zeilen entsprechend den sed-Kommandos, die Sie in ein sed-Skript geschrieben haben, und gibt die bearbeiteten Zeilen auf die Standard-Ausgabe aus. sed liest das sed-Skript entweder von der Kommandoaufrufzeile oder aus einer Datei. Die Eingabedateien bleiben unverändert. Wenn Sie die Änderungen sichern möchten, lenken Sie die Standard-Ausgabe in eine Datei um.
Syntax
Format 1: |
sed[ -n] skript[ datei...] |
Format 2: |
sed[ -n][ -e skript]...[ -f skriptdatei]...[ datei...] |
unterdrückt die standardmäßig erfolgende Ausgabe jeder bearbeiteten Eingabezeile auf die Standard-Ausgabe (siehe Beispiel 6). -n nicht angegeben:
sed liest das sed-Skript skript, mit dem die Eingabedatei bearbeitet werden soll, von der Kommandoaufrufzeile. Wenn skript Leerzeichen, Neue-Zeile-Zeichen oder Shell-Sonderzeichen enthält, müssen Sie das Kommando in Hochkommas einschließen: ’skript’
Name der Datei, deren Inhalt sed bearbeiten soll. Sie können nur Text-Dateien mit sed bearbeiten. datei nicht angegeben: |
unterdrückt die standardmäßig erfolgende Ausgabe jeder bearbeiteten Eingabezeile auf die Standard-Ausgabe (siehe Beispiel 6). -n nicht angegeben:
sed liest das sed-Skript skript, mit dem die Eingabedatei bearbeitet werden soll, von der Kommandoaufrufzeile. Wenn skript Leerzeichen, Neue-Zeile-Zeichen oder Shell-Sonderzeichen enthält, müssen Sie das Kommando in Hochkommas einschließen: ’skript’ Sie können -e skript mehrmals und auch zusammen mit -f skriptdatei angeben. sed liest dann die sed-Kommandos aus allen angegebenen sed-Skripts. Enthält die Kommandoaufrufzeile nur einmal die Option -e und nicht die Option -f, können Sie skript auch ohne -e angeben.
sed liest das sed-Skript, mit dem die Eingabedatei bearbeitet werden soll, aus der Datei Sie können -f skriptdatei mehrmals und auch zusammen mit -e skript angeben. sed liest
Name der Datei, deren Inhalt sed bearbeiten soll. Sie können nur Text-Dateien mit sed bearbeiten. datei nicht angegeben: |
Arbeitsweise
sed arbeitet jeweils mit Kopien der Eingabezeilen. Sie werden nacheinander in den sogenannten Musterspeicher kopiert. Normalerweise bearbeitet sed die Eingabezeilen in folgendem Zyklus: 1. Schritt: Die nächste (am Dateianfang die erste) Eingabezeile wird in den Musterspeicher kopiert. 2. Schritt: Alle sed-Kommandos im sed-Skript, welche die zuletzt in den Musterspeicher kopierte Zeile adressieren, werden nacheinander auf den Inhalt des Musterspeichers angewandt. Abhängig von den sed-Kommandos wird dabei der Inhalt des Musterspeichers verändert oder auch nicht. 3. Schritt: Der bearbeitete Inhalt des Musterspeichers wird auf die Standard-Ausgabe ausgegeben, und der Musterspeicher wird gelöscht. Dieser Zyklus wird solange durchlaufen, bis die Eingabe erschöpft ist. Der Musterspeicher kann manchmal auch mehrere Zeilen enthalten (siehe sed-Kommandos g, G, N). Als Adresse des Musterspeichers gilt jedoch immer die Adresse der zuletzt in den Musterspeicher kopierten Zeile. Einige sed-Kommandos (g, G, h, H) benutzen zusätzlich einen sogenannten Haltespeicher, in dem der Inhalt des Musterspeichers vollständig oder teilweise zur späteren Wiederverwendung gespeichert wird. |
Format eines sed-Skripts
Ein sed-Skript besteht aus Kommandozeilen der Form:
oder
Die geschweiften Klammern müssen Sie nur angeben, wenn Sie bereich angeben. Zwischen bereich und sed-Kommando darf kein Leerzeichen stehen. Mit bereich wählen Sie bestimmte Eingabezeilen aus. Wenn bereich den Musterspeicher, d.h. die zuletzt in den Musterspeicher kopierte Eingabezeile adressiert, wird das zugehörige sed-Kommando bzw. die sed-Kommandoliste auf den Inhalt des Musterspeichers angewandt. Sie können für bereich eine Adresse oder zwei durch ein Komma getrennte Adressen angeben. bereich = adresse Jede zuletzt in den Musterspeicher kopierte Eingabezeile, die zu adresse passt, ist adressiert. bereich = adresse1,adresse2 Der Bereich von der durch adresse1 adressierten Eingabezeile bis zu der durch adresse2 adressierten Eingabezeile, einschließlich der Intervallgrenzen, ist adressiert. Adressiert adresse2 eine Zeile, die in der Eingabedatei vor der mit adresse1 adressierten Zeile liegt, gilt nur adresse1. bereich nicht angegeben: |
Adressen
letzte Zeile der Datei
n-te Eingabezeile, wobei n eine positive ganze Zahl ist. Die Nummern ergeben sich, indem alle Eingabezeilen fortlaufend durchnummeriert werden.
Eingabezeile, die eine zu muster passende Zeichenkette enthält. Wenn muster selbst einen Schrägstrich enthält, muss er mit einem Gegenschrägstrich \ davor entwertet werden. muster ist ein einfacher regulärer Ausdruck (siehe Tabellen und Verzeichnisse, Reguläre Ausdrücke) mit folgenden Änderungen: Die Angabe \?regulärer ausdruck?, wobei ? ein beliebiges Zeichen ist, gleichbedeutend mit /regulärer ausdruck/. Dabei steht ein mit einem Gegenschrägstrich \ entwertetes ? für sich selbst, begrenzt also nicht den regulären Ausdruck. Zum Beispiel steht die Adresse \xabc\xdefx für die Zeichenkette: abcxdef Die Escape-Sequenz \n passt zum Neue-Zeile-Zeichen im Musterspeicher. Ein Punkt passt zu jedem Zeichen außer dem letzten Neue-Zeile-Zeichen im Musterspeicher. |
sed-Kommandos
Im Folgenden sind die sed-Kommandos in alphabetischer Reihenfolge beschrieben. Das Argument text besteht aus einer oder mehreren Zeilen, von denen alle bis auf die letzte mit einem Gegenschrägstrich
(a - append) Im Anschluss an die Ausgabe des Inhalts des Musterspeichers wird text ausgegeben.
(b - branch) Im sed-Skript wird zu dem sed-Kommando :marke verzweigt. marke nicht angegeben:
(c - change) Der adressierte Bereich wird gelöscht, wenn er im Musterspeicher ist, text wird ausgegeben und der nächste Zyklus wird gestartet.
(d - delete) Der Inhalt des Musterspeichers wird gelöscht und der nächste Zyklus wird gestartet. Der 3. Schritt, die Ausgabe des Inhalts des Musterspeichers, entfällt.
(d - delete) Der Inhalt des Musterspeichers wird vom Anfang bis zum ersten Neue-Zeile-Zeichen gelöscht und der nächste Zyklus wird gestartet.
Der Inhalt des Haltespeichers ersetzt den Inhalt des Musterspeichers.
Der Inhalt des Haltespeichers wird an den Musterspeicher angefügt.
Der Inhalt des Musterspeichers ersetzt den Inhalt des Haltespeichers.
Der Inhalt des Musterspeichers wird an den Haltespeicher angefügt.
(i - insert) text wird vor dem Inhalt des Musterspeichers ausgegeben.
(l - list) Der Inhalt des Musterspeichers wird auf die Standard-Ausgabe ausgegeben, wobei nicht-druckbare Zeichen durch Ersatz-Zeichen (z.B. Tabulatorzeichen durch das Größerzeichen>) oder als Oktalzahlen (siehe Tabellen und Verzeichnisse, Zeichensatz ISO 646) in der Form
(n - next) Der Inhalt des Musterspeichers wird auf die Standard-Ausgabe ausgegeben und durch die nächste Eingabezeile ersetzt. Die Adresse der eigegebenen Zeile wird zur Adresse des Musterspeichers.
Die nächste Eingabezeile wird einschließlich des Neue-Zeile-Zeichens an den Inhalt des Musterspeichers angefügt. Die Adresse der letzten angefügten Zeile wird zur Adresse des Musterspeichers.
(p - print) Der Inhalt des Musterspeichers wird auf die Standard-Ausgabe ausgegeben. Nicht druckbare Zeichen werden nicht dargestellt.
(p - print) Der Anfang des Musterspeichers wird bis zum ersten Neue-Zeile-Zeichen einschließlich auf die Standard-Ausgabe ausgegeben. Nicht druckbare Zeichen werden nicht dargestellt.
(q - quit) sed wird beendet. Haben Sie mehrere sed-Skripts angegeben, wird sed beim ersten q beendet, das in irgendeinem der Skripts steht.
(r - read) Der Inhalt der Datei rdatei wird gelesen und vor dem Kopieren der nächsten Eingabezeile in den Musterspeicher auf die Standard-Ausgabe ausgegeben. rdatei muss, durch genau ein Leerzeichen vom sed-Kommando r getrennt, am Ende der Kommandozeile stehen.
(s - substitute) Zeichenketten im Musterspeicher, zu denen der reguläre Ausdruck rA passt, werden durch ersetzungszeichenkette ersetzt. Für rA können Sie einfache reguläre Ausdrücke angeben (siehe Tabellen und Verzeichnisse, Reguläre Ausdrücke). Als Trennzeichen können Sie außer dem Schrägstrich / jedes beliebige Zeichen verwenden. Nähere Informationen siehe ed-Kommando s.
(n - number) Nur die n-te zu rA passende Zeichenkette in einer Zeile wird durch ersetzungszeichenkette ersetzt. n ist eine ganze Zahl von 1 bis 512.
(g - global) Alle zu rA passenden Zeichenketten in einer Zeile werden durch ersetzungszeichenkette ersetzt.
(p - print) Der Inhalt des Musterspeichers wird auf die Standard-Ausgabe ausgegeben, falls eine Ersetzung durchgeführt wurde, auch wenn sed mit Option -n aufgerufen wurde.
(w - write) Der Inhalt des Musterspeichers wird in die Datei wdatei geschrieben, falls eine Ersetzung durchgeführt wurde. Der Inhalt einer bereits vor dem sed-Aufruf existierenden Datei mit dem Namen wdatei wird überschrieben. Wenn innerhalb eines sed-Skripts mehrere w-Kommandos in dieselbe Datei wdatei schreiben, wird der Inhalt des Musterspeichers jeweils an den Inhalt von wdatei angehängt. wdatei muss, durch genau ein Leerzeichen vom sed-Kommando w getrennt, am Ende der Kommandozeile stehen. In einem sed-Aufruf dürfen Sie maximal 10 verschiedene Dateien für wdatei verwenden. Achtung! parameter nicht angegeben:
(t -test) Im sed-Skript wird zu dem sed-Kommando :marke verzweigt, falls seit dem letzten Kopieren einer Eingabezeile in den Musterspeicher oder dem letzten Aufrufen eines t-Kommandos eine Ersetzung durchgeführt wurde. marke nicht angegeben:
(w - write) Der Inhalt des Musterspeichers wird in die Datei wdatei geschrieben. Der Inhalt einer bereits vor dem sed-Aufruf existierenden Datei mit dem Namen wdatei wird überschrieben. Wenn innerhalb eines sed-Skripts mehrere w-Kommandos in dieselbe Datei wdatei schreiben, wird der Inhalt des Musterspeichers jeweils an den Inhalt von wdatei angehängt. wdatei muss, durch genau ein Leerzeichen vom sed-Kommando w getrennt, am Ende der Kommandozeile stehen. In einem sed-Aufruf dürfen Sie maximal 10 verschiedene Dateien für wdatei verwenden. Achtung!
(x - exchange) Der Inhalt des Muster- und Haltespeichers wird ausgetauscht.
Jedes Vorkommen eines Zeichens aus zeichenkette1 wird durch das entsprechende Zeichen aus zeichenkette2 ersetzt. zeichenkette1 und zeichenkette2 müssen gleich lang sein und explizit angegeben werden. Reguläre Ausdrücke können nicht verwendet werden.
kommando ist ein sed-Kommando oder eine in geschweiften Klammern {...} eingeschlossene sed-Kommandoliste und wird auf alle Zeilen angewandt, die nicht durch bereich adressiert sind.
Dieses Kommando setzt im Skript die marke, die von den Kommandos b und t angesprungen werden kann. Für marke können Sie bis zu 8 Zeichen angeben.
Die aktuelle Zeilennummer wird auf die Standard-Ausgabe in einer eigenen Zeile ausgegeben.
Die in geschweiften Klammern {...} eingeschlossenen sed-Kommandos werden nacheinander ausgeführt, wenn bereich den aktuellen Musterspeicher adressiert. Der öffnenden Klammer { können Leerzeichen vorausgehen, gefolgt von weiteren Leerzeichen und Tabulatoren. <enter> Das Neue-Zeile-Zeichen gilt als leeres Kommando und wird ignoriert. Sie können so Ihre sed-Skripts durch Leerzeilen übersichtlich gliedern. Steht in der ersten Zeile einer Skriptdatei als erstes Zeichen ein #, wird der darauffolgende Zeileninhalt als Kommentar interpretiert.
Steht in der ersten Zeile einer Skriptdatei als erstes Zeichen ein #n, wird die standardmäßige Ausgabe des Musterspeichers unterdrückt (entspricht der Option -n). Der auf #n folgende Zeileninhalt wird als Kommentar gewertet und nicht als sed-Kommando interpretiert. |
Fehler
Das sed-Skript enthält einen Syntaxfehler. Nach dem Doppelpunkt wird die Stelle aus dem Skript ausgegeben, an der sich sed beendet hat.
Das sed-Skript enthält ein unbekanntes Kommando. |
Internationale Umgebung
Die folgenden Umgebungsvariablen beeinflussen die Ausführung des Kommandos sed: LANG Gibt einen Standardwert für die Variablen für die internationale Umgebung an, die nicht gesetzt oder Null sind. Ist LANG nicht gesetzt oder Null, wird der entsprechende Standardwert der internationalen Umgebung verwendet. Enthält eine der Internationalisierungsvariablen eine ungültige Einstellung, verhält sich das Kommando so, als sei keine der Variablen definiert worden. LC_ALL Ist diese Variable auf einen Wert gesetzt, d. h. ist sie nicht leer, überschreibt dieser Wert die Werte aller übrigen Internationalisierungsvariablen. LC_COLLATE Legt die internationale Umgebung für die Bedeutung von Zeichenbereichen, Äquivalenzklassen und Zeicheneinheiten in geklammerten regulären Ausdrücken fest. LC_CTYPE Legt die internationale Umgebung für die Interpretation der Byte-Folgen eines Datentexts als Zeichen fest (z.B. Singlebytezeichen im Unterschied zu Mehrbytezeichen in Argumenten). LC_CTYPE bestimmt zusätzlich, welche Zeichen bei Verwendung des Kommandos l als nichtdruckbar betrachtet werden. LC_MESSAGES Legt die internationale Umgebung für Format und Inhalt der Diagnosemeldungen fest, die in die Standardfehlerausgabe geschrieben werden. NLSPATH Legt den Pfad der Meldungsdateien für LC_MESSAGES fest. |
Beispiel 1
In alle Leerzeilen einer Datei die Zeichenkette XXXXX schreiben und die Ausgabe in eine andere Datei umlenken:
Mit /^$/ sind alle Leerzeilen adressiert, d.h. Zeilen, in denen zwischen Zeilenanfang und Zeilenende nichts, auch kein Leerzeichen, steht. sed sucht nach dem Zeilenanfang ^ und ersetzt ihn durch die Zeichenkette XXXXX. |
Beispiel 2
Alle Zeilen einer Datei, die mit einer Ziffer beginnen, um 4 Leerzeichen einrücken und die Ausgabe in eine andere Datei umlenken:
Mit /^[0-9]/ sind alle Zeilen adressiert, in denen am Zeilenanfang eine Ziffer von 0 bis 9 einschließlich steht. sed sucht nach dem Zeilenanfang ^ und ersetzt ihn durch 4 Leerzeichen |
Beispiel 3
Alle Zeilen einer Datei ausgeben, die keine Leerzeilen sind:
Alle Leerzeilen werden mit /^$/ adressiert und mit d gelöscht. |
Beispiel 4
Alle Zeilen einer Datei mit jeweils einer Leerzeile dazwischen ausgeben:
Da keine Adresse angegeben ist, sucht sed in jeder Zeile nach dem Zeilenende $ und ersetzt es durch ein Neue-Zeile-Zeichen, d.h. es wird ein zusätzliches Neue-Zeile-Zeichen eingefügt. |
Beispiel 5
Ausgeben der zweiten und dritten Spalte einer Datei, deren Spalten jeweils durch einen
Erläuterung:
In jeder Zeile wird die Zeichenkette zwischen dem ersten und zweiten Schrägstrich
Beliebig viele (*) Zeichen außer Doppelpunkt ([^:])
Doppelpunkt
Klammerung eines Teilausdrucks, der in der Ersetzungszeichenkette zwischen dem zweiten und dritten Schrägstrich wiederverwendet werden soll
Die Ersetzungszeichenkette soll mit dem in der zweiten Klammer \(...\) stehenden Teilausdruck beginnen.
Zwischen dem ersten und zweiten Teilausdruck in der Ersetzungszeichenkette soll ein Doppelpunkt stehen.
Die Ersetzungszeichenkette soll mit dem in der ersten Klammer \(...\) stehenden Teilausdruck enden. |
Beispiel 6
Aus der Datei pers alle Berufe herausfiltern und mit einer neuen Überschrift in die Datei berufe schreiben. Voraussetzung für das folgende Beispiel ist, dass die erste Zeile der Eingabedatei keinen Suchbegriff, in diesem Fall „Beruf:“ enthält. Die Datei pers hat folgenden Aufbau: Name: Hans Mueller Familienstand: geschieden Beruf: Journalist Name: Karin Becker Familienstand: verheiratet Beruf: Programmiererin usw. sed-Programm:
Erläuterung: Jede Zeile im Musterspeicher, die mit Beruf: beginnt, wird ersetzt durch die Zeichenkette, die jeweils darauf folgt und mit H an den Haltespeicher angefügt. Die letzte Zeile der Datei im Musterspeicher ($) wird mit g ersetzt durch den gesamten Inhalt des Haltespeichers. Mit p wird der Inhalt des Musterspeichers ausgegeben. Die Option -n sorgt dafür, dass die in den Musterspeicher kopierten Eingabezeilen nach ihrer Bearbeitung nicht automatisch auf die Standard-Ausgabe geschrieben werden. Nur der mit dem sed-Kommando p bearbeitete Inhalt des Musterspeichers wird ausgegeben. |
Siehe auch
awk, ed, grep Tabellen und Verzeichnisse, Reguläre Ausdrücke |