Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
Shell-Programmierung von Jürgen Wolf
Einführung, Praxis, Referenz
Buch: Shell-Programmierung

Shell-Programmierung
782 S., mit CD, 44,90 Euro
Rheinwerk Computing
ISBN 3-89842-683-1
gp Kapitel 12 Der Stream-Editor sed
  gp 12.1 Funktions- und Anwendungsweise von sed
    gp 12.1.1 Wohin mit der Ausgabe?
  gp 12.2 Der sed-Befehl
  gp 12.3 Adressen
  gp 12.4 Kommandos, Substitutionsflags und Optionen von sed
    gp 12.4.1 Das a-Kommando – Zeile(n) anfügen
    gp 12.4.2 Das c-Kommando – Zeilen ersetzen
    gp 12.4.3 Das d-Kommando – Zeilen löschen
    gp 12.4.4 Die Kommandos h, H, g, G und x – Arbeiten mit den Puffern
    gp 12.4.5 Das Kommando i – Einfügen von Zeilen
    gp 12.4.6 Das p-Kommando – Patternspace ausgeben
    gp 12.4.7 Das Kommando q – Beenden
    gp 12.4.8 Die Kommandos r und w
    gp 12.4.9 Das Kommando s – substitute
    gp 12.4.10 Das Kommando y
  gp 12.5 sed-Scripts

Kapitel 12 Der Stream-Editor sed

sed ist ein relativ altes Tool, wird aber immer noch vielfach eingesetzt, etwa um Zeilen einer Datei oder eines Datenstroms zu manipulieren. Besonders häufig und gern wird sed zum Suchen und Ersetzen von Zeichenfolgen verwendet.


Rheinwerk Computing

12.1 Funktions- und Anwendungsweise von sedowntop

Bevor Sie sich mit dem Editor sed auseinander setzen, möchte Ich Ihnen zunächst die grundlegende Funktionsweise des sed-Kommandos beschreiben. sed wurde bereits in den 70-ern von Lee E. McMahon in den Bell Labs entwickelt. Der Name sed steht für Stream EDitor. Natürlich ist sed kein Editor in dem Sinne, wie Sie es vielleicht von »vim« oder »Emacs« her kennen.

Mittlerweile hat jede Linux- bzw. UNIX-Distribution eine eigene sed-Version. Linux verwendet gewöhnlich GNU-sed, was eine erweiterte Variante des Ur-sed ist. Bspw. bietet GNU-sed »in-place-editing«, womit eine Änderung direkt im Eingabefilter möglich ist. Solaris wiederum bietet gleich drei Versionen von sed an, eine von AT&T-abgeleitete, eine von BSD UNIX und eine weitere, die dem XPG4-Standard entspricht (natürlich kann unter Solaris und BSD auch GNU-sed verwendet werden). Generell unterscheiden sich die einzelnen Versionen in der Funktionsvielfalt, was hier allerdings kein Problem sein sollte, da vorwiegend auf die grundlegenden Funktionen von sed eingegangen wird, die jedes sed kennen sollte.

sed bekommt seine Kommandos entweder aus einer Datei oder von der Kommandozeile. Meistens handelt es sich aber um eine Datei. Diese Datei (bzw. das Kommando aus der Kommandozeile) liest sed Zeile für Zeile von der Standardeingabe ein, kopiert diese in einen extra dafür angelegten Puffer (in den so genannten Patternspace), bearbeitet diesen Puffer nach einer von Ihnen bestimmten Regel und gibt den veränderten Puffer anschließend wieder auf die Standardausgabe aus. Bei dem Puffer handelt es sich um eine Kopie einer jeden Zeile, das heißt, jegliche Kommandoausführung von sed bezieht sich von nun an auf diesen Puffer. Die Quelldatei bleibt hierbei immer unverändert. Es sollte hier klar geworden sein, dass sed zeilenweise arbeitet – eine Zeile wird eingelesen, bearbeitet und wieder ausgegeben. Natürlich findet dieser ganze Arbeitsvorgang in einer Schleife statt (siehe Abbildung 12.1).


Hinweis   Dass die Quelldatei unverändert bleibt, sorgt immer wieder für Verwirrung.

Aber eigentlich ist dies logisch, denn es ist nun mal nicht möglich, gleichzeitig aus einer Datei zu lesen und in sie hineinzuschreiben. Man muss also die Ausgabe in einer temporären Datei speichern, zurückkopieren und die temporäre Datei wieder löschen.



Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 12.1   Die Arbeitsweise von sed


Neben dem Puffer Patternspace gibt es noch einen zweiten Puffer, den Holdspace. Diesen können Sie mit speziellen Kommandos verwenden, um Daten untereinander (zwischen dem Pattern- und Holdspace) auszutauschen. Die Puffergröße (oder auch die Zeichen, die pro Zeile aufgenommen werden können) ist bei moderneren sed-Versionen unbegrenzt. Bei älteren Versionen gibt es häufig noch eine Begrenzung auf 8192 Zeichen.

Die Syntax zu sed lautet:

sed [-option] Kommando [Datei] ... [Datei_n]
sed -f Kommandodatei [Datei] ... [Datei_n]

Damit die Kommandos nicht mit der fleißigen Shell und deren Mühen, Metazeichen vorher zu interpretieren, kollidieren, sollten Sie die sed-Kommandos zwischen Single Quotes setzen.

sed [-option] 'Kommando' [Datei] ... [Datei_n]

Natürlich können Sie auch mehrere Kommandos auf einmal verwenden. Hierzu müssen Sie entweder die einzelnen Kommandos mit einem Semikolon voneinander trennen oder aber Sie schreiben in jeder Zeile ein Kommando.

sed 'Kommando1 ; Kommando2 ; Kommando3' Date
sed 'Kommando1
> Kommando2
> Kommando3' Datei

Hier als Beispiel drei verschiedene sed-Kommandos, welche alle drei zum selben Ziel führen:

you@host > sed -n  '/Scott/p' mrolympia.dat
Larry Scott USA 1965 1966
you@host > sed -n  '/Scott/p' < mrolympia.dat
Larry Scott USA 1965 1966
you@host > cat mrolympia.dat | sed -n '/Scott/p'
Larry Scott USA 1965 1966

sed liest immer von der Standardeingaben und schreibt standardmäßig auf die Standardausgabe. Mit dem letzten Parameter können Sie einen oder auch mehrere Dateinamen angeben, von denen sed aus dem Eingabestrom lesen soll. Wie Sie im Beispiel sehen konnten, können Sie sich hier auch der Umlenkungszeichen (<, >, |) bedienen. Die nähere Bedeutung der sed-Befehle, die im Beispiel eben verwendet wurden, werden Sie in den folgenden Abschnitten näher kennen lernen.


Rheinwerk Computing

12.1.1 Wohin mit der Ausgabe?  toptop

Wenn Sie den sed-Editor verwenden, werden Sie wohl im seltensten Fall eine Ausgabe auf dem Bildschirm machen wollen. Hierzu gibt es drei gängige Anwendungsmöglichkeiten, die Ausgabe von sed in die richtigen Bahnen zu lenken. Hier werden erst mal die gängigsten Methoden von sed behandelt, ohne jetzt auf die einzelnen Optionen bzw. Features von sed einzugehen.


Hinweis   Die Ausgabe von sed erfokgt auf den Standardausgabekanal, Fehlermeldungen erfolgen auf den Standardfehlerkanal. Der Rückgabewert von sed ist dabei ungleich (meistens größer als) 0.


Mehrere Dateien bearbeiten

Wenn Sie mehrere Dateien auf einmal mit sed bearbeiten wollen bzw. müssen, kann es sinnvoll sein, anstatt eines Kommandos eine Kommandodatei zu verwenden – man darf hierzu gern auch sed-Script sagen. Der Vorteil: Diese Kommandodatei können Sie jederzeit wieder verwenden. Also, statt eine Datei wie folgt mit sed zu bearbeiten

sed -n 'kommando ; kommando; kommando' Datei > Zieldatei

können Sie ein sed-Script verwenden:

sed -f ased_script.sed Datei > Zieldatei

Damit können Sie de facto mehrere Dateien komfortabel mit einem sed-Script bearbeiten. Theoretisch könnten Sie hierbei vorgefertigte sed-Scripts einsetzen, ohne dass Sie überhaupt Kenntnisse von sed haben (was allerdings nicht sehr empfehlenswert ist). Wie Sie eigene sed-Scripts schreiben, erfahren Sie in Abschnitt 12.5. Gewöhnlich werden Sie das sed-Script auf mehrere Dateien auf einmal in einem Shellscript ansetzen. Dies können Sie dann bspw. folgendermaßen machen:

# Alle Dateien im aktuellen Verzeichnis
for file in *
do
   sed -f ased_script.sed $file > temp
   # Achtung, hier wird das Original verändert!!!
   mv tmp $file
done

Direkt aus einem Kommando bearbeiten

Im Beispiel oben wurden mehrere Dateien neu bearbeitet. Wenn Sie ein wenig vorausschauender arbeiten, könnten Sie diesen Schritt auch auslassen, indem Sie gleich von vorn herein darauf achten, dass man die Datei gar nicht bearbeiten muss (natürlich ist dies nicht immer möglich). Dies lässt sich wieder mit einer Pipe realisieren:

kommando | sed -f ased_script.sed > Datei
kommando | sed -n 'kommando' > Datei
shellscript | sed -f ased_script.sed > Datei
shellscript | sed -f 'Kommando' > Datei

Hierbei schreibt ein Prozess (ein Kommando oder auch ein Shellscript) seine Daten in die Standardausgabe durch die Pipe. Auf der anderen Seite der Pipe wartet sed mit der Standardeingabe auf diese Daten und verarbeitet sie zeilenweise mit dem sed-Script. Die Ausgabe wird mit einer Umlenkung in eine Datei geschrieben.

Direkt aus einer Datei bearbeiten

Selbstverständlich können Sie mit sed auch einen Text aus einer Datei extrahieren, zerlegen und in eine neue Zieldatei speichern, ohne die Originaldatei zu verändern.

sed -n '/ein_wort/p' Datei > Zieldatei

Damit extrahiert sed alle Zeilen mit dem Wort »ein_wort« aus Datei und schreibt diese Zeilen in die Zieldatei.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
 << zurück
  
  Zum Katalog
Zum Katalog: Shell-Programmierung
Shell-Programmierung
bestellen
 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-Server






 Linux-Server


Zum Katalog: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Katalog: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Katalog: Linux Handbuch






 Linux Handbuch


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2005
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de