Arbeiten mit sed

Mit einem 'normalen' Editor ist das Bearbeiten von Dateien etwas aufwändig. Datei laden, Position suchen, Text aendern, Datei speichern. Wie aufwändig dies ist, sieht man erst im Vergleich zum Streameditor sed.

Wenn wir z.B. die ersten drei Zeilen einer Datei loeschen wollen, gehen wir so vor:

sed -e '1,3D' eingabe.txt

Wenn Sie dieses Beispiel mit einer echten Datei testen, wird Ihnen vermutlich nicht gefallen, dass die Ausgabe nur auf dem Bildschirm erscheint. Also leiten wir die Standardausgabe auf eine Datei um:

sed -e '1,3D' eingabe.txt > ausgabe.txt

Die Datei eingabe.txt bleibt unverändert. In ausgabe.txt wird der Inhalt von eingabe.txt ohne die ersten drei Zeilen geschrieben. Wenn Sie die letzte Zeile löschen wollen:

sed -e '$D' eingabe.txt > ausgabe.txt

Das Zeichen $ steht als für die letzte Zeile. Dieser Befehl würde also alles ab der 2. Zeile löschen:

sed -e '2,$D' eingabe.txt > ausgabe.txt

Statt der Zeilennummern können wir aber die Grenzen des Arbeitsbereichs auch mit regulären Ausdrücken festlegen. Der folgende Befehl löscht alles ab dem Auftreten von 'BEGIN' bis zum Auftreten von 'END':

sed -e '/BEGIN/END/D' eingabe.txt > ausgabe.txt

Würde 'END' nicht gefunden, so würde sed bis zum Dateiende weiter löschen.

Zu guter Letzt wollen wir die Auswahl umkehren - es sollen z.B. alle Zeilen gelöscht werden, nur die letzte nicht:

sed -e '$ ! D' eingabe.txt > ausgabe.txt

Das geht natürlich auch mit regulären Ausdrücken:

sed -e '/BEGIN/END/D' eingabe.txt > ausgabe.txt

Statt mit der Umleitung (>) kann sed auch inline (direkt in der Datei) editieren. Dazu einfach den Schalter -i verwenden:

sed -i -e '1,3D' eingabe.txt

Einer Zeile einen String hinzufügen, die mit einem bestimmten String anfängt:

sed '/^User_Alias ADMINS=/ s/$/,newadmin/' /etc/sudoers

Zeile mit pattern +X nachfolgende Zeilen löschen:

sed -e '/pattern/,+5d' datei.txt

Rekursive Verarbeitung verschiedenster Dateien:

find -type f -name "*.conf" -print0 | xargs -0 sed -i 's#http_certificate = "30,14"#http_certificate = "14,7"#'

Diskussion

Geben Sie Ihren Kommentar ein. Wiki-Syntax ist zugelassen:
J V A V K