Viele Nutzer von Linux und seinen zahl­rei­chen Dis­tri­bu­tio­nen arbeiten ge­le­gent­lich oder re­gel­mä­ßig auf der Ebene der Kom­man­do­zei­le. Im Terminal lassen sich einige Aufgaben schneller oder besser erledigen als in der gra­fi­schen Ober­flä­che. Dafür muss man al­ler­dings die ver­schie­de­nen Befehle und ihre Funk­ti­ons­wei­sen kennen. Ein solches Kommando in Linux ist ‚sed‘.

Zwar ist der Stream Editor (sed) ein Text­edi­tor, aber nicht so, wie man sich eine solche Software land­läu­fig vorstellt. In Linux ist SED ein Befehl, mit dem man Da­ten­strö­me auslesen und anpassen kann. Man setzt das Werkzeug deshalb vor allem in der Shell-Pro­gram­mie­rung ein. Wie funk­tio­niert das?

Wozu setzt man in Linux SED ein?

Der Befehl ‚sed‘ gehört zur Grund­aus­stat­tung von jeder Linux-In­stal­la­ti­on, da er zu den GNU Core Utilities (coreutils) gehört. Das Werkzeug wird als nicht­in­ter­ak­ti­ver Text­edi­tor be­zeich­net. Dies bedeutet, dass man eine Änderung nicht direkt an der Datei vornimmt, die be­ar­bei­tet wird. Statt­des­sen erzeugt man zunächst eine temporäre Datei, deren Inhalt an­schlie­ßend an die Aus­gangs­da­tei übergeben wird. Dabei geht Linux SED zei­len­wei­se vor. Jede Zeile einer Datei wird einzeln ein­ge­le­sen, be­ar­bei­tet und dann wieder aus­ge­ge­ben. Die wich­tigs­te Funktion von SED ist es, bestimmte Zei­chen­ket­ten in der Datei zu suchen und dann durch andere Zeichen zu ersetzen.

Auf diese Weise können Sie eine komplette Datei – quasi au­to­ma­ti­siert – mit nur einem Befehl grund­le­gend verändern. Wenn man solche Befehle in ein Shell-Skript in­te­griert, kann man sich immer wie­der­ho­len­de Aufgaben stark ver­ein­fa­chen. Auf diese Weise lassen sich bei­spiels­wei­se Da­ten­ban­ken oder ein um­fang­rei­cher Quellcode pflegen. Statt jeden Eintrag per Hand an­zu­pas­sen, kann man mit SED die komplette Datei in einem Rutsch durch­ge­hen.

Syntax und Funktion des SED-Befehls

Der SED-Befehl arbeitet mit Kommandos und wird auf Dateien an­ge­wen­det. Sowohl der Befehl an sich als auch die Kommandos können noch durch Optionen erweitert werden.

sed [Option(en)] 'Kommando(s)' [Datei(en)]

Kommandos können Sie entweder direkt in den Befehl eintragen oder aus einer Datei auslesen. In letzterem Fall geben Sie dann statt dem Kommando den Pfad der Datei ein.

Optionen

Wie man es von Linux-Befehlen gewohnt ist, hat man auch bei SED die Mög­lich­keit, Parameter zu setzen. Diese sind beim SED-Befehl besonders wichtig, da erst durch sie klar wird, wie das dar­auf­fol­gen­de Kommando in­ter­pre­tiert werden soll. Folgende Optionen kommen in Frage:

Option Erklärung
-e Gibt an, dass ein oder mehrere SED-Skripte verwendet werden.
-f Gibt an, dass das Skript aus einer Datei gezogen wird.
-n Er­geb­nis­se werden nicht aus­ge­ge­ben.
-i Erzeugt eine tem­po­rä­re­re Datei, die an­schlie­ßend die Aus­gangs­da­tei ersetzt.
-u Es wird kein Da­ten­puf­fer ein­ge­setzt.
-s Mehrere Dateien werden separat behandelt statt als einem langen Da­ten­strom.
-r Der Befehl ak­zep­tiert er­wei­ter­te reguläre Ausdrücke.

Die Optionen -e und -f sind am wich­tigs­ten. Sie geben an, ob das Kommando direkt im Befehl steht (dann handelt es sich um ein SED-Skript) oder ob der Befehl sich an eine zu­sätz­li­che Datei wenden muss. Auf die -e-Option können Sie oftmals ver­zich­ten, da es sich um den Stan­dard­fall handelt. Sobald man al­ler­dings mehr als ein Kommando gleich­zei­tig in den Befehl einbaut, muss die Option zwingend aktiviert werden.

Hinweis

Wenn Sie die Option -e einsetzen, muss der Parameter direkt vor das erste Kommando ge­schrie­ben werden. Verwenden Sie noch weitere Optionen, schreiben Sie diese also davor. Bauen Sie weitere Kommandos in den Befehl ein, setzen Sie auch hier jeweils die Option voran.

Sehr wichtig – und ver­mut­lich bei Ihrer Arbeit un­ver­zicht­bar – ist die Option -n. Ist der Parameter nicht gesetzt, wird jede einzelne Zeile der ein­ge­le­se­nen Textdatei im Terminal angezeigt, was gerade bei großen Da­ten­ban­ken wenig sinnvoll ist. Wenn man die Option aktiviert, werden nur die Zeilen angezeigt, die vom Kommando auch betroffen sind.

Kommandos

Mit einem Kommando ver­mit­teln Sie dem Befehl, was dieser mit der Aus­gangs­da­tei und unter Be­rück­sich­ti­gung der an­ge­ge­be­nen Optionen zu erledigen hat.

Kommando Be­schrei­bung
a append: Fügt den aus­ge­such­ten Zeilen eine oder mehrere andere Zeilen hinzu.
c change: Ersetzt die aus­ge­such­ten Zeilen mit neuem Inhalt.
d delete: Löscht die aus­ge­such­ten Zeilen.
g get: Kopiert den Inhalt vom hold space in den pattern space.
G Get­New­li­ne: Fügt den Inhalt des hold space dem pattern space hinzu.
h hold: Kopiert den Inhalt vom pattern space in den hold space.
H Hold­New­Li­ne: Fügt den Inhalt des pattern space dem hold space hinzu.
i insert: Fügt eine oder mehrere Zeilen vor den aus­ge­such­ten Zeilen ein.
l listing: Zeigt alle nicht druck­ba­ren Zeichen an.
n next: Wechselt für die nächste Zeile zum folgenden Kommando im Befehl.
p print: Zeigt die aus­ge­such­ten Zeilen an.
q quit: Beendet Linux SED.
r read: Liest aus­ge­such­te Zeilen aus einer Datei aus.
s sub­sti­tu­te: Ersetzt eine fest­ge­leg­te Zei­chen­fol­ge durch eine andere.
x xchange: Ver­tauscht pattern space und hold space mit­ein­an­der.
y yank: Ersetzt ein fest­ge­leg­tes Zeichen durch ein anderes.
w write: Schreibt Zeilen in eine Textdatei.
! Negation: Wendet das Kommando auf Zeilen an, die nicht auf die Eingabe zutreffen.
Fakt

Die beiden Spei­cher­ty­pen hold space und pattern space haben un­ter­schied­li­che Aufgaben: Der pattern space be­schreibt einen kurz­fris­ti­gen Ar­beits­spei­cher. Darin befinden sich die Daten, mit denen der Befehl gerade arbeitet. Der hold space ist lang­fris­ti­ger angelegt. Daten, die sich dort befinden, können auch dann noch abgerufen werden, wenn SED bereits mit etwas anderem be­schäf­tigt ist.

Die Kommandos kann man zudem mit Optionen erweitern:

Option Be­schrei­bung
= Gibt die Zei­len­num­mer der aus­ge­such­ten Zeilen an.
p Gibt die ge­än­der­ten Zeilen aus.
g Wendet das Kommando auf die komplette Datei an.
Fakt

Sie sollten Kommandos immer mit einfachen An­füh­rungs­zei­chen beginnen und enden lassen. Auf diese Weise ver­hin­dern Sie, dass die Eingabe re­inter­pre­tiert werden muss. Prin­zi­pi­ell sind die Zeichen zwar nicht notwendig, aber so umgeht man viele Feh­ler­quel­len.

Reguläre Ausdrücke

Für die Ver­wen­dung von SED ist es wichtig, reguläre Ausdrücke zu verstehen. Die Zeichen dienen dazu, dem Befehl mit­zu­tei­len, wie dieser mit einer Folge von Zeichen umzugehen hat. Wichtig sind bei­spiels­wei­se eckige und runde Klammern:

  • [ABC]: Eine Zei­chen­klas­se verwendet man dann, wenn man aus einer Gruppe von Buch­sta­ben, Ziffern oder Symbolen eine Über­ein­stim­mung sucht; also entweder A oder B oder C.
  • (ABC): Eine Zei­chen­grup­pe be­schreibt einen festen Begriff; also ABC in dieser Rei­hen­fol­ge.

Wildcards er­mög­li­chen es bei regulären Aus­drü­cken, auch nur nach Teilen von Begriffen zu suchen. Sie können zwei ver­schie­de­ne Varianten verwenden:

  • .: Der Punkt ersetzt genau ein Zeichen.
  • *: Der Asterisk ersetzt beliebig viele Zeichen.

Zudem geben Ihnen reguläre Ausdrücke die Mög­lich­keit, die Häu­fig­keit von Zeichen(-Kom­bi­na­tio­nen) genauer zu bestimmen.

  • ?: Das Fra­ge­zei­chen gibt an, dass ein Begriff einmal oder gar nicht vorkommen darf.
  • +: Das Plus­zei­chen legt fest, dass das Zeichen mehrmals, aber min­des­tens einmal vorkommt.
  • {0,n}: Mit einer Zahl innerhalb von ge­schweif­ten Klammern legen Sie genau fest, wie oft die Zei­chen­kom­bi­na­ti­on vorkommen darf. Wenn Sie zwei Werte eingeben (mit einem Komma getrennt), bestimmen Sie die minimalen und maximalen Wie­der­ho­lun­gen.

Schließ­lich können Sie beim Umgang mit Linux und SED auch noch logische Zeichen einbauen, die Ihnen bei­spiels­wei­se beim Ver­knüp­fen oder Ver­schach­teln von Such­an­fra­gen helfen.

  • |: Eine Pipe steht zwischen zwei Begriffen und sym­bo­li­siert eine Al­ter­na­ti­ve der beiden.
  • ^: Das Zir­kum­flex (direkt vor einen Begriff ge­schrie­ben) negiert diesen; diese Zei­chen­fol­ge darf demnach nicht vorkommen.

Mit diesen Zeichen mo­di­fi­zie­ren Sie also die Eingabe im SED-Befehl und können auf diese Weise komplexe Aufgaben erledigen.

Adressen

Die Eingaben werden bei Linux SED als Adressen be­zeich­net. Eine Adresse ist also das Ziel des Befehls. Dieses können Sie auf un­ter­schied­li­che Weise angeben. In vielen Si­tua­tio­nen werden Sie mit regulären Aus­drü­cken aus­ge­schmück­te Such­an­fra­gen eingeben. Es ist aber bei­spiels­wei­se auch möglich, Zeilen der Textdatei direkt an­zu­wäh­len. Dem­entspre­chend un­ter­schied­lich notieren Sie die Adressen.

Im ersten Beispiel beziehen Sie sich auf konkrete Zeilen:

sed -n '10,50p' text.txt

Sie würden mit diesem Code die Zeilen 10 bis 50 im Terminal ausgeben.

Wissen Sie nicht genau, in welchen Zeilen die In­for­ma­tio­nen zu finden sind, mit denen Sie arbeiten wollen, können Sie nach der Adresse suchen lassen. Wichtig ist hierbei, dass Sie Ausdrücke immer mit Schräg­stri­chen beginnen und enden lassen. So trennen Sie den ei­gent­li­chen Such­be­griff von anderen In­for­ma­tio­nen wie etwa den Kommandos.

sed -n 'beispiel.[1-9]/p' text.txt

Dieser Code würde Ihnen alle Zeilen ausgeben, die als Beispiel oder als Beispiele be­zeich­net sind und an­schlie­ßend eine Ziffer haben.

SED an drei Bei­spie­len erklärt

Der SED-Befehl kann in un­ter­schied­lichs­ten Si­tua­tio­nen schnelle Hilfe bringen. Besonders wenn Sie in um­fang­rei­che Text­da­tei­en viele Än­de­run­gen auf einmal vornehmen müssen, spielt das Tool seine Stärken aus. In den folgenden drei Bei­spie­len sehen Sie ver­schie­de­ne Mög­lich­kei­ten, wie SED im Linux-Alltag ein­ge­setzt werden kann.

Textdatei durch­su­chen

Der ein­fachs­te An­wen­dungs­fall ist das Suchen nach be­stimm­ten Daten in einem Dokument. In­ter­es­sant ist das bei­spiels­wei­se in um­fang­rei­chen Da­ten­ban­ken oder auch im Quellcode. So kann man schnell eine Stelle finden, die man entweder nur nachlesen oder auch abändern möchte.

Nehmen wir nun bei­spiel­haft an, dass Sie in Ihrem aus­la­den­den Wein­kel­ler einen Char­don­nay suchen. Zu­sätz­lich möchten Sie auch die erste Zeile der Datenbank anzeigen lassen, in der die einzelnen Spalten erklärt werden. Folgender Befehl hilft Ihnen dabei, die Position der Flaschen zu finden:

sed -n -e '1p' -e '/Chardonnay/p' wein.txt

Sie verwenden hier zwei Kommandos nach­ein­an­der. Beide werden durch -e ein­ge­lei­tet. Das Ergebnis sieht dann fol­gen­der­ma­ßen aus:

Regal An­bau­ge­biet Rebsorte Jahrgang
1 Pfalz Char­don­nay 2001
2 Mosel Char­don­nay 1983
3 Elsass Char­don­nay 1981

Möchten Sie nun nur die Jahrgänge der 1980er Jahre anzeigen, geht auch das mit einer kleinen Ab­än­de­rung des Codes.

sed -n -e '1p' -e '/Chardonnay * 198./p' wein.txt
Regal Anbaugebiet Rebsorte Jahrgang
2 Mosel Chardonnay 1983
3 Elsass Chardonnay 1981

Die Wildcard zwischen Rebsorte und Jahrgang ist prin­zi­pi­ell in diesem Beispiel nicht wichtig. Falls die Datenbank jedoch feh­ler­haft ist oder Sie nach­träg­lich eine Spalte einfügen, bleibt die Angabe korrekt.

In­for­ma­tio­nen hin­zu­fü­gen

Mit Linux und dem SED-Befehl können Sie auch Da­ten­ban­ken erweitern. Um neue Einträge zu machen, müssen Sie die Datei also nicht mit einem kom­plet­ten Text­edi­tor öffnen, ändern und speichern. Statt­des­sen nehmen Sie die Änderung mit nur einer Codezeile vor.

Für unser Beispiel nehmen wir jetzt an, dass Sie zwei neue Flaschen Wein für Ihre Sammlung erhalten haben. Diese möchten Sie ver­ständ­li­cher­wei­se auch in der ent­spre­chen­den Datenbank eintragen. Sie können mit SED einfach ans Ende der Textdatei eine neue Zeile anhängen.

sed -i -e '$a2 Mosel Dornfelder 2010' -e '$a4 Elsass Grauburgunder 2011' wein.txt

Der reguläre Ausdruck $ sorgt dafür, dass SED zunächst in die letzte Zeile springt. Das Kommando a bewirkt das Hin­zu­fü­gen einer neuen Zeile mit dem Inhalt, der schließ­lich folgt. Wir verwenden die Option -i, damit die Aus­gangs­da­tei direkt ab­ge­än­dert wird. Al­ter­na­tiv könnte man eine neue Datenbank erstellen:

sed -e '$a2 Mosel Dornfelder 2010' -e '$a4 Elsass Grauburgunder 2011' wein.txt > wein1.txt

Da­ten­ban­ken pflegen

Möchte man in großen Da­ten­ban­ken mit vielen Einträgen nach­träg­lich den Aufbau ändern, ist das manuell kaum zu schaffen. Linux bietet mit SED aber eine schnelle Lösung. Bisher sind in Ihrer Datei die einzelnen Spalten durch ein Leer­zei­chen von­ein­an­der getrennt. Gehen wir nun in diesem Beispiel davon aus, dass Sie das Leer­zei­chen mit einem Bin­de­strich ersetzen möchten. Dafür verwenden wir das s-Kommando:

sed -i -e 's/[[:space:]]/-/g' wein.txt

Das g am Ende der Adresse sorgt dafür, dass der Befehl auf die komplette Datei an­ge­wen­det wird.

Eine ähnliche Her­aus­for­de­rung stellt sich, wenn Sie zu­sätz­li­che In­for­ma­tio­nen innerhalb einer Zeile einfügen möchten. Nehmen wir nun bei­spiel­haft an, Sie möchten zukünftig auch vermerken, ob Sie den Wein bereits probiert haben oder nicht. Bevor Sie nun weitere un­be­kann­te Weine in Ihr Sortiment aufnehmen, markieren Sie erst alle Weine als bereits ver­kös­tigt.

sed -i -e 's/$/-bekannt/g' wein.txt

Nun ist die Mar­kie­rung in allen Zeilen eingefügt – ein­schließ­lich der ersten Zeile, in der Sie die Spalten benennen. Um dies zu ändern, nehmen Sie noch eine Ersetzung in der ersten Zeile vor.

sed -i -e '1s/bekannt/Verköstigt/' wein.txt

Al­ter­na­ti­ven zu SED

Linux SED ist ein kraft­vol­ler Befehl, mit dem Sie viele ver­schie­de­ne Aufgaben erledigen können. Manches lässt sich al­ler­dings nur sehr um­ständ­lich und mit ein paar Kniffen lösen. Mit ähnlichen Befehlen können Sie dann viel­leicht schneller und sicherer ans Ziel gelangen.

AWK

Als Wei­ter­ent­wick­lung von SED hat sich AWK etabliert. Auch bei diesem Befehl arbeitet man mit regulären Aus­drü­cken, hat aber zu­sätz­lich Mög­lich­kei­ten, die man aus kom­ple­xe­ren Pro­gram­mier­spra­chen kennt. So können Sie mit AWK auch Befehle zu­sam­men­stel­len, die If-Else-An­wei­sun­gen oder While-Do-Schleifen be­inhal­ten.

PERL

Während sich AWK in erster Linie an C-Sprachen ori­en­tiert, gibt es auch einen Befehl, der auf Basis von PERL funk­tio­niert. Zwar lassen sich mit der Sprache auch komplexe Systeme erstellen, aber für kleinere Aufgaben innerhalb des Terminals oder in Bash-Skripten ist PERL ebenfalls geeignet.

TR

Wenn Sie einzelne Zeichen in einer Textdatei umwandeln möchten, geht dies unter Umständen mit einem anderen Befehl als SED einfacher: TR (kurz für: translate) ist darauf ausgelegt, Buch­sta­ben, Ziffern oder Son­der­zei­chen durch andere zu ersetzen. So lassen sich bei­spiels­wei­se schnell doppelte Leer­zei­chen entfernen oder Groß-/Klein­schrei­bung anpassen. Während solche kleineren Aufgaben mit TR sehr einfach zu erledigen sind, müssen für kom­ple­xe­re Arbeiten andere Lösungen wie SED her­an­ge­zo­gen werden.

Zum Hauptmenü