Zum Inhalt springen

Sed: Unterschied zwischen den Versionen

Aus Foxwiki
 
(56 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
{{DISPLAYTITLE:sed}}
'''sed''' - '''S'''trom'''ed'''itor zum Filtern und Umwandeln von Text
'''sed''' - Stromeditor zum Filtern und Umwandeln von Text


== Beschreibung ==
== Beschreibung ==
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.
[[Unix]]-Werkzeug, mit dem Text-[[Datenstrom|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 <code>sed</code> mittels eines [[Skriptsprache|Skripts]] gesteuert.
 
Der <code>sed</code>-Befehlssatz orientiert sich an jenem des [[Zeilenorientierter Editor|zeilenorientierten Texteditors]] [[Ed (Texteditor)|ed]]. Dabei werden für die Text-Durchmusterung laut der [[Portable Operating System Interface|POSIX]]-Spezifikation eine bestimmte Abart der [[Regulärer Ausdruck|Regular Expressions]], sogenannte (POSIX-) ''Basic Regular Expressions'' (BRE) verwendet.<ref>{{Internetquelle |url=http://pubs.opengroup.org/onlinepubs/009695399/utilities/sed.html#tag_04_126_13_02 |titel=sed-Spezifikation der Open Group |sprache=en |zugriff=2013-03-27}}</ref> Die [[GNU]]-Implementation verwendet allerdings ''GNU-BRE''s, die von ''POSIX-BRE''s geringfügig abweichen.


* Da es ein "nicht-interaktives" Programm ist, kann es, falls gewünscht, zur Automatisierung der Bearbeitung verwendet werden.  
Auch wenn der Sprachumfang von <code>sed</code> ziemlich limitiert und spezialisiert erscheint, so handelt es sich doch um eine [[Turing-Vollständigkeit|Turing-vollständige]] Sprache. Beweisen kann man die Turing-Vollständigkeit, indem man eine [[Turingmaschine]] mittels <code>sed</code> programmiert<ref>{{Internetquelle |url=http://www.catonmat.net/ftp/sed/turing.txt |titel=Implementation of a Turing Machine as Sed Script |sprache=en |zugriff=2013-03-23}}</ref><ref>{{Internetquelle |url=http://www.stunet.tu-freiberg.de/~bahmann/turing-sed/ |titel=Turing-Maschine mit ''sed'' |sprache=de |zugriff=2013-03-17}}</ref> oder indem man mit ''sed'' einen Interpreter für eine andere, Turing-vollständige Sprache schreibt.<ref>{{Webarchiv|url=http://mi.eng.cam.ac.uk/~er258/code/sed/ |wayback=20100418131328 |text=cam.ac.uk}}</ref>
* 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.  
Folglich konnten und wurden sogar Spiele wie [[Sokoban]] oder [[Arkanoid]] und andere anspruchsvolle Programme wie [[Debugger]] mit sed geschrieben.<ref>{{Internetquelle |url=http://sed.sourceforge.net/grabbag/scripts/#misc |titel=Liste verschiedener sed-Skripte |sprache=en |zugriff=2011-11-19}}</ref>
* 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.  
; 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.
* Beide sind anfangs leer.


=== Funktionsweise ===
; Funktionsweise
* Geben Sie den Musterpuffer auf stdout aus.  
* Geben Sie den Musterpuffer auf stdout aus.
* Der Stream-Editor ist kein herkömmlicher Editor wie Vi oder Emacs.  
* 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 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 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.  
* Sed lädt die aktuell betrachtete Zeile in einen temporären Puffer - im Folgenden als Arbeitspuffer bezeichnet.


==== Unix Sed Arbeitsmethodik ====
==== Arbeitsmethodik ====
; Dies wird als ein Ausführungszyklus bezeichnet
; Ausführungszyklus
* Der Zyklus wird fortgesetzt, bis das Ende der Datei/Eingabe erreicht ist # Lesen einer ganzen Zeile aus stdin/file.
* Der Zyklus wird fortgesetzt, bis das Ende der Datei/Eingabe erreicht ist # Lesen einer ganzen Zeile aus stdin/file
# Entfernt alle nachstehenden Zeilenumbrüche.
# Entfernt alle nachstehenden Zeilenumbrüche
# Legt die Zeile in seinen Musterpuffer.
# Legt die Zeile in seinen Musterpuffer
# Ändert den Musterpuffer entsprechend den übergebenen Befehlen.
# Ändert den Musterpuffer entsprechend den übergebenen Befehlen


==== Reguläre Ausdrücke ====
==== Reguläre Ausdrücke ====
; POSIX.2-BREs sollten unterstützt werden
; 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.  
* 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.
* 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 ==
== Installation ==
  # apt install sed
  # '''apt install sed'''


== Syntax ==
== Aufruf ==
  sed [-V] [--version] [--help] [-n] [--quiet] [--silent]
  $ '''sed''' [-V] [--version] [--help] [-n] [--quiet] [--silent]
  [-l N] [--line-length=N] [-u] [--unbuffered]
  [-l N] [--line-length=N] [-u] [--unbuffered]
  [-E] [-r] [--regexp-extended]
  [-E] [-r] [--regexp-extended]
Zeile 46: Zeile 59:
{| class="wikitable sortable options"
{| class="wikitable sortable options"
|-
|-
! Option !! Beschreibung
! Unix !! GNU !! Beschreibung
|-
|-
| -n, --quiet, --silent || unterdrückt die Ausgabe des Musterbereichs
| -n || --quiet, --silent || unterdrückt die Ausgabe des Musterbereichs
|-
|-
| --debug || Kommentiert die Programmausführung
| || --debug || Kommentiert die Programmausführung
|-
|-
| -e Skript, --expression=Skript || Fügt das Skript zu den auszuführenden Befehlen hinzu
| -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
| -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
| || --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)
| -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
| -l N || --line-length=N || Gibt die gewünschte Zeilenumbruchlänge für den Befehl »l« an
|-
|-
| --posix || Deaktiviert alle GNU-Erweiterungen
| || --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)
| -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
| -s || --separate || Betrachtet Dateien getrennt statt als einzigen, kontinuierlichen langen Strom
|-
|-
| --sandbox || Arbeitet im »Sandbox«-Modus (deaktiviert e/r/w-Befehle)
| || --sandbox || Arbeitet im »Sandbox«-Modus (deaktiviert e/r/w-Befehle)
|-
|-
| -u, --unbuffered || Lädt minimale Datenmenge aus den Eingabedateien und schreibt die Ausgabepuffer öfter
| -u || --unbuffered || Lädt minimale Datenmenge aus den Eingabedateien und schreibt die Ausgabepuffer öfter
|-
|-
| -z, --null-data || Zeilen durch NUL-Zeichen trennen
| -z || --null-data || Zeilen durch NUL-Zeichen trennen
|-
|-
| --help || zeigt Hilfeinformationen an und beendet das Programm
| || --help || zeigt Hilfeinformationen an und beendet das Programm
|-
|-
| --version || gibt Versionsinformationen aus und beendet das Programm
| || --version || gibt Versionsinformationen aus und beendet das Programm
|}
|}


=== Parameter ===
=== Befehle ===
=== Umgebungsvariablen ===
[[Sed/Befehle]]
=== Exit-Status ===
 
=== Rückgabewert ===


== Anwendungen ==
== Anwendungen ==
# [[Sed/Aufruf]]
=== Arbeitsweise ===
# [[Sed/Dateiübergabe]]
<code>sed</code> kann sowohl innerhalb einer [[Pipe (Informatik)|Pipeline]] als auch auf [[Datei]]en arbeiten. Ausgaben erfolgen grundsätzlich auf <code><stdout></code>, Fehlermeldungen auf <code><stderr></code>. Der typische Aufruf sieht deshalb so aus:
# [[Sed/Ausgabe]]
 
# [[Sed/Kommandos]]
:{|
# [[Sed/Substitutionen]]
|
# [[Sed/Regular Expressions]]
sed &apos;Anweisung1
# [[Sed/Beispieltext]]
      Anweisung2
# [[Sed/Anweisungen]]
      …
# [[Sed/Zeilen ausgeben]]
      Anweisung''N''&apos; Eingabedatei > Ausgabedatei
# [[Sed/Adressierung]]
''&lt;stream>'' | sed &apos;Anweisung1
# [[Sed/Zeilen löschen]]
                Anweisung2
# [[Sed/Suchen und Ersetzen]]
                …
# [[Sed/Mehrere Kommandos]]
                Anweisung''N''&apos; | ''<stream>''
# [[Sed/Einfügen]]
|}
# [[Sed/Einfügen aus einer Datei]]
 
# [[Sed/Schreiben in eine Datei]]
<code>sed</code> liest eine Eingabedatei (oder einen <code>input stream</code> auf <code><stdin></code>) 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 <code><stdout></code> ausgegeben und die Anweisungsliste ebenfalls mit der nächsten Eingabezeile wieder begonnen.
# [[Sed/Dateien direkt bearbeiten]]
# [[Sed/Dateien ergänzen]]
# [[Sed/Nächste Zeile beabeiten]]
# [[Sed/Zeichen tauschen]]
# [[Sed/Sed vorzeitig beenden]]
# [[Sed/Zeilentausch]]
# [[Sed/Sed-Skripte]]


== Siehe auch ==
== Siehe auch ==
Zeile 118: Zeile 125:
# http://sed.sf.net/grabbag/
# http://sed.sf.net/grabbag/


=== Unterseiten ===
{{Special:PrefixIndex/{{BASEPAGENAME}}}}
{{Special:PrefixIndex/{{BASEPAGENAME}}}}


Zeile 124: Zeile 130:
# https://www.gnu.org/software/sed/manual/sed.html
# https://www.gnu.org/software/sed/manual/sed.html


==== Man-Pages ====
==== Man-Page ====
* {{man|1|sed|posix|stream editor}}
* {{man|1|sed|bsd|stream editor}}
* {{man|1|sed|gnu|Stromeditor zum Filtern und Umwandeln von Text}}
 
==== Info-Pages ====
==== Info-Pages ====
  $ info sed
  $ info sed


=== Links ===
=== Links ===
==== Einzelnachweise ====
<references />
==== Projekt ====
==== Projekt ====
==== Weblinks ====
==== Weblinks ====
# https://de.wikipedia.org/wiki/Sed_(Unix)
# [http://sed.sourceforge.net/ sed-Projektseite auf sourceforge] (englisch)
# [http://sed.sourceforge.net/grabbag/ seder’s grab bag] (englisch)
# [http://www.pement.org/sed/ sed für Windows mit funktionierender -i Option] ([[ZIP-Dateiformat|ZIP]]; 50&nbsp;kB)
# [https://tty1.net/sed-tutorium/index.html Ausführliches Tutorium] (deutsch)


== Testfragen ==
{{DEFAULTSORT:sed}}
<div class="toccolours mw-collapsible mw-collapsed">
{{DISPLAYTITLE:sed}}
''Testfrage 1''
<div class="mw-collapsible-content">'''Antwort1'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 2''
<div class="mw-collapsible-content">'''Antwort2'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 3''
<div class="mw-collapsible-content">'''Antwort3'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 4''
<div class="mw-collapsible-content">'''Antwort4'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 5''
<div class="mw-collapsible-content">'''Antwort5'''</div>
</div>


[[Kategorie:Sed]]
[[Kategorie:Linux/Befehl]]
[[Kategorie:Linux/Befehl]]
[[Kategorie:Bash/Scripting]]
[[Kategorie:Regular Expression]]
{{DEFAULTSORT:sed}}
= TMP =
Dies ist nur eine knappe Übersicht über die Befehle von Sed, als Erinnerung für alle, die Sed bereits kennen. Für ausführlichere Beschreibungen
müssen andere Dokumentationen (wie das Texinfo-Dokument) herangezogen werden.
;»Befehle« ohne Adressen
: Marke
  Marke für b- und t-Befehle
#Kommentar
  Der Kommentar läuft bis zum nächsten Zeilenumbruch (oder dem Ende eines -e-Skriptfragments)
}
  Die schließende Klammer eines { }-Blocks
; Befehle ohne oder mit einer Adresse
=      Gibt die aktuelle Zeilennumer aus
a \
  Text  Text anhängen, der eingebettete Zeilenumbrüche mit vorangestelltem Rückschrägstrich (»backslash«) enthält
i \
  Text  Text einfügen, der eingebettete Zeilenumbrüche mit vorangestelltem Rückschrägstrich (»backslash«) enthält
q [Rückgabewert]
  Das Sed-Skript sofort ohne Verarbeitung weiterer Eingabe beenden. Allerdings wird der aktuelle Musterbereich ausgegeben, falls »auto-print« nicht deaktiviert ist. Das Argument Rückgabewert ist eine GNU-Erweiterung.
Q [Rückgabewert]
  Das Sed-Skript sofort ohne Verarbeitung weiterer Eingabe beenden. Dies ist eine GNU-Erweiterung.
r Dateiname
  Aus Dateiname eingelesenen Text anhängen
R Dateiname
  Eine Zeile aus Dateiname einlesen und anhängen. Jeder Aufruf des Befehls liest eine Zeile der Datei. Dies ist eine GNU-Erweiterung.
Befehle, die Adressbereiche akzeptieren
{      Beginnt einen Befehlsblock (Ende mit einem })
b Marke
Verzweigt zu Marke. Falls Marke fehlt, verzweigt zum Ende des Skripts
c \
Text  Ersetzt die ausgewählte Zeile mit Text, der eingebettete Zeilenumbrüche mit vorangestelltem Rückschrägstrich (»backslash«) enthält
d      Löscht den Musterbereich. Beginnt den nächsten Zyklus.
D      Falls der Musterbereich keinen Zeilenumbruch enthält, wird ein neuer Zyklus begonnen, als ob der Befehl »d« angegeben worden wäre.
Andernfalls wird der Text im Musterbereich bis zu dem ersten Zeilenumbruch gelöscht und der Zyklus mit dem entstandenen Musterbereich neu
gestartet, ohne eine neue Eingabezeile zu lesen.
h H    Kopiert/Hängt den Musterbereich in den Haltebreich (hold space) (an)
g G    Kopiert/Hängt den Haltebereich in den Musterbereich (an)
l      Führt die aktuelle Zeile in einer »visuell eindeutigen« Art auf
l Breite
Führt die aktuelle Zeile in einer »visuell eindeutigen« Art auf und bricht dabei nach Breite Zeichen um. Dies ist eine GNU-Erweiterung.
n N    Liest/Hängt die nächste Zeile der Eingabe in den Musterbereich (an)
p      Gibt den aktuellen Musterbereich aus.
P      Gibt bis zum ersten eingebetteten Zeilenumbruch im aktuellen Musterbereich aus.
s/RegAusdr/Ersatz/
Sucht die Entsprechung von RegAusdr im Musterbereich und falls erfolgreich, ersetzt den passenden Teil mit Ersatz. Ersatz kann das besondere
Zeichen & enthalten, um auf den Teil des Musterbereichs zu verweisen, der passte, und die besonderen Maskiersequenzen \1 bis \9, die auf die
entsprechenden passenden Teilausdrücke in RegAusdr verweisen.
t Marke
Falls s/// eine erfolgreiche Ersetzung durchgeführt hat, seit die letzte Eingabezeile gelesen wurde und seit dem letzten t- oder T-Befehl,
dann wird zu Marke verzweigt. Falls Marke fehlt, wird zum Ende des Skripts verzweigt.
T Marke
Falls kein s/// eine erfolgreiche Ersetzung durchgeführt hat, seit die letzte Eingabezeile gelesen wurde und seit dem letzten t- oder
T-Befehl, dann wird zu Marke verzweigt. Falls Marke fehlt, wird zum Ende des Skripts verzweigt.
w Dateiname
Schreibt den aktuellen Musterbereich nach Dateiname
W Dateiname
Schreibt die erste Zeile des aktuellen Musterbereichs in Dateiname. Dies ist eine GNU-Erweiterung.
x      Tauscht den Inhalt des Halte- und Musterbereichs
y/Quelle/Ziel/
Übersetzt die Zeichen im Musterbereich, die in Quelle auftauchen, in die entsprechenden Zeichen in Ziel
=== Adressen ===
Befehle von Sed können ohne Adresse angegeben werden. In diesem Fall werden sie für alle Eingabezeilen ausgeführt. Wird eine Adresse angegeben,
werden sie nur für Zeilen ausgeführt, die auf diese Adresse passen. Werden zwei Adressen (das Maximum) angegeben, dann wird der Befehl für alle
Eingabezeilen ausgeführt, die auf den einschließenden Bereich passen, der bei der ersten Adresse beginnt und bis zur zweiten Adresse läuft. Es gibt
drei Dinge, die Sie bei Adressbereichen beachten sollten: Die Syntax lautet Adr1,Adr2 (d.h. die Adressen werden durch ein Komma getrennt), die
Zeile, auf die Adr1 passt, wird immer akzeptiert, selbst falls Adr2 eine davor liegende Zeile auswählen sollte und falls Adr2 ein regulärer Ausdruck
ist, wird er nicht gegen die Zeile, auf die Adr1 passte, geprüft.
Nach der Adresse (oder dem Adressbereich) und vor dem Befehl kann ein ! eingefügt werden, das angibt, dass der Befehl nur ausgeführt werden darf,
falls die Adresse (oder der Adressbereich) nicht passt.
Die folgenden Adresstypen werden unterstützt:
Nummer Passt nur auf die angegebene Zeile Nummer (die über Dateien hinweg kummulativ ansteigt, außer die Option -s ist auf der Befehlszeile
angegeben worden).
Erster~Abstand
Passt auf jede Abstands Zeile, beginnend mit Erster. Beispielsweise wird »sed -n 1~2p« alle ungeraden Zeilen in dem Eingabestrom ausgeben und
die Adresse 2~5 wird auf jede fünfte Zeile, beginnend mit der zweiten, passen. Erster kann Null sein, in diesem Fall verhält sich Sed als ob
er identisch mit Abstand wäre (dies ist eine Erweiterung).
$      Passt auf die letzte Zeile
/RegAusdr/
Passt auf Zeilen, die auf den regulären Ausdruck RegAusdr passen. Der Abgleich erfolgt auf dem aktuellen Musterraum, der mit Befehlen wie
»s///« verändert werden kann.
\cRegAusdrc
Passt nur auf Zeilen, die auf den regulären Ausdruck RegAusdr passen. Das c kann jedes Zeichen sein.
GNU-Sed unterstützt auch einige besondere 2-Adressformen:
0,Adr2 Beginnt in dem Zustand »passe auf erste Adresse« bis Adr2 gefunden wird. Dies ist ähnlich zu 1,Adr2, abgesehen davon, dass wenn Adr2 auf die
allererste Zeile der Eingabe passt, der Ausdruck 0,Adr2 sich am Ende seines Bereichs befinden wird, während der Ausdruck 1,Adr2 sich noch am
Anfang seines Bereichs befinden wird. Dies funktioniert nur, falls Adr2 ein regulärer Ausdruck ist.
Adr1,+N
Passt auf Adr1 und die N auf Adr1 folgenden Zeilen
Adr1,~N
Passt auf Adr1 und die Adr1 folgenden Zeilen bis zu der nächsten Zeile, deren Eingabezeilennummer ein Vielfaches von N ist

Aktuelle Version vom 12. Dezember 2024, 09:27 Uhr

sed - Stromeditor zum Filtern und Umwandeln von Text

Beschreibung

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.

Arbeitsmethodik

Ausführungszyklus
  • Der Zyklus wird fortgesetzt, bis das Ende der Datei/Eingabe erreicht ist # Lesen einer ganzen Zeile aus stdin/file
  1. Entfernt alle nachstehenden Zeilenumbrüche
  2. Legt die Zeile in seinen Musterpuffer
  3. Ä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

Sed/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

  1. awk(1)
  2. ed(1)
  3. grep(1)
  4. tr(1)
  5. perlre(1)
  6. sed.info
  7. Sed-FAQ http://sed.sf.net/grabbag/tutorials/sedfaq.txt
  8. http://sed.sf.net/grabbag/

Dokumentation

  1. https://www.gnu.org/software/sed/manual/sed.html

Man-Page

Info-Pages

$ info sed

Links

Projekt

Weblinks

  1. https://de.wikipedia.org/wiki/Sed_(Unix)
  2. sed-Projektseite auf sourceforge (englisch)
  3. seder’s grab bag (englisch)
  4. sed für Windows mit funktionierender -i Option (ZIP; 50 kB)
  5. Ausführliches Tutorium (deutsch)