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 du dieses Beispiel mit einer echten Datei testest, wird dir 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"#'
Einen String mit vorgestelltem Prefix „verdoppeln“:
# Beispielliste mit Domainnamen. domainliste.txt enthält: 1lik28pvitfl8q9o0jh.de li816ifohpxhwfuj0d5.de v6rhv3hwx3w9cgd4syi.de gxxkz832p71j6hujron.de aen9nldoy5wds640yg5.de okzi8954w6ihsbcvai8.de
Mit diesem Kommando wird jede Zeile verdoppelt, mit Leerzeichen getrennt und dem ersten Eintrag ein www. vorangestellt:
cat domainliste.txt | sed 's/\<.*\>/www.& &/' www.1lik28pvitfl8q9o0jh.de 1lik28pvitfl8q9o0jh.de www.li816ifohpxhwfuj0d5.de li816ifohpxhwfuj0d5.de www.v6rhv3hwx3w9cgd4syi.de v6rhv3hwx3w9cgd4syi.de www.gxxkz832p71j6hujron.de gxxkz832p71j6hujron.de www.aen9nldoy5wds640yg5.de aen9nldoy5wds640yg5.de www.okzi8954w6ihsbcvai8.de okzi8954w6ihsbcvai8.de
Mit tr läßt sich noch der Zeilenumbruch in ein Leerzeichen umwandeln. Nützlich um z.B. aus einer Domainliste einen Eintrag für die /etc/hosts zu generieren:
cat domainliste.txt | sed 's/\<.*\>/www.& &/' | tr '\n' ' ' www.1lik28pvitfl8q9o0jh.de 1lik28pvitfl8q9o0jh.de www.li816ifohpxhwfuj0d5.de li816ifohpxhwfuj0d5.de www.v6rhv3hwx3w9cgd4syi.de v6rhv3hwx3w9cgd4syi.de [...]