sed

 

Eine typische Anwendung ist das Ersetzen von Ausdrücken:

sed 's/alt/neu/g' Eingabedatei >Ausgabedatei

Die Veränderungsregel 's/alt/neu/g' besagt, dass in jeder Zeile der Eingabedatei die Vorkommen des Regulären Ausdrucks 'alt' durch die Zeichenfolge 'neu' zu ersetzen ist. Das führende 's' ist ein sed-Befehl. Er bedeutet, dass eine Zeichen-Ersetzung (substitution) stattfinden soll. Das 'g' am Ende gibt vor, dass die Veränderung global, d. h. für alle Vorkommen in jeder Zeile, vorgenommen werden soll.

Durch den Operator > wird die Ausgabe des Programms, die normalerweise auf den Standard Output Stream (Stdout) erfolgt, in eine Datei geschrieben. Dies erfolgt nicht durch sed selbst, sondern durch den Kommandozeileninterpreter; diese Operation ist prinzipiell bei jedem Programm möglich, das auf Stdout Daten ausgibt.

Auch das Ersetzen von mehrfachen Leerzeichen durch ein einziges ist möglich:

 sed 's/ \+/ /g' Eingabedatei >Ausgabedatei 

In diesem Falle steht das '\+' für ein- oder mehrmals das vorherige Zeichen, womit nicht nur ein Leerzeichen, sondern auch mehrere hintereinander ersetzt werden. Falls in der alten oder der neuen Zeichenfolge bereits ein '/' vorkommt, behilft man sich statt des '/' in folgendem Beispiel mit einem anderen Sonderzeichen (das erste Zeichen nach s wird als Trennzeichen definiert, gemäß 's!alt!neu!g'):

 sed 's!/tmp/!!g' 

ersetzt alle Vorkommen von '/tmp/' durch nichts (löscht diese also aus dem Text), daher die zwei '!' direkt nebeneinander.

Obwohl der 's'-Befehl der meistbenutzte Befehl ist, gibt es weitere nützliche Befehle. So gibt es den Befehl 'd', der eine Zeile löscht. Durch

sed 'd' Eingabedatei >Ausgabedatei

würde allerdings immer eine leere Ausgabedatei entstehen. Das wäre recht sinnlos. Man kann deshalb allgemein Befehle nur auf solche Zeilen anwenden, die einen bestimmten Text enthalten.

sed '/fehler/d' Eingabedatei >Ausgabedatei

Hier werden alle Zeilen, die den Text zwischen den Schrägstrichen enthalten (im Beispiel fehler) entfernt. So kann man sed auch (anstatt grep) dazu benutzen, um alle Zeilen einer Datei auszudrucken, die einem bestimmten Muster entsprechen:

sed -n '/einMuster/p' Eingabedatei

Die Option '-n' gibt dabei an, dass sed nichts ausgeben soll, wenn es nicht durch den 'p'-Befehl explizit gefordert wird. Ohne diese kopiert sed automatisch jede Zeile der Eingabedatei in die Ausgabedatei (in diesem Fall, da nicht explizit eine Datei angegeben wurde, das aktuelle Terminal).

Löschen aller Zeilen, die höchstens Leerzeichen beinhalten:  

sed '/^ *$/d' Eingabedatei >Ausgabedatei

Der Befehl d bedeutet, dass die betreffende Zeile gelöscht werden soll, ^ steht für den Zeilenanfang, $ für das Zeilenende. Das Leerzeichen und der darauffolgende Asterisk (*) bedeuten beliebig viele (auch kein) Leerzeichen.

Suche einen Text in einer Zeile ersetzte diesen und den rest der Zeile:

cat /etc/bluetooth/rfcomm.conf | sed {s/device\ .*$/device\ 00:00:00:00:00:00\;/} 

.*$ ist dafür Verantwortlich

Diese Beispiele zeigen einen typischen Einsatzbereich von sed: Einfache Aufgaben, die durch kurze Regeln beschreibbar sind. Diese Regeln erlauben weiterhin den Einsatz Regulärer Ausdrücke, die (u. a.) durch sed bekannt geworden sind.

Umlaute und Leerzeichen aus Dateinamen Löschen

Zum Schluss ein kleines Beispielskript, um Umlaute oder Leerzeichen aus Dateinamen zu entfernen.

 

#!/bin/bash
# Umlaute und Leerzeichen weg
# Sa Aug 02 17:19:13 CEST 2008 Andreas Meier
# (c) --> http://creativecommons.org/licenses/by-nc-sa/3.0/de/

find . -print | while read fn;
do
   replace="$(echo -n "$fn" | tr '[01-40]' '[_*]')";
   replace="$(echo "$replace" |
   sed -e 's-ä-ae-g' -e 's-ö-oe-g' -e 's-ü-ue-g' \
       -e 's-Ä-Ae-g' -e 's-Ö-Oe-g' -e 's-Ü-Ue-g' \
       -e 's-ß-ss-g')"
   echo gebe Datei "$fn neuen Namen $replace";
   mv "$fn" "$replace";
done
Das Skript wurde von unseren Mitglied Andreas Meier erstellt.