sed
sed (Stream Editor) ist ein mächtiges Kommandozeilenwerkzeug zur Textmanipulation. Es verarbeitet Text zeilenweise und führt Operationen wie Suchen, Ersetzen, Einfügen und Löschen durch. sed ist besonders nützlich für automatisierte Textverarbeitung in Skripten und Pipelines.
Voraussetzungen
Grundlegende Syntax
sed [OPTIONEN] 'BEFEHL' [DATEI...]
Häufige Anwendungsfälle
Text ersetzen
# Erste Vorkommen in jeder Zeile ersetzen
sed 's/alt/neu/' datei.txt
# Alle Vorkommen in jeder Zeile ersetzen (global)
sed 's/alt/neu/g' datei.txt
# Datei direkt bearbeiten (in-place)
sed -i 's/alt/neu/g' datei.txt
# Backup vor Änderung erstellen
sed -i.bak 's/alt/neu/g' datei.txt
Groß-/Kleinschreibung ignorieren
sed 's/fehler/ERROR/gi' datei.txt
Zeilen löschen
# Leere Zeilen löschen
sed '/^$/d' datei.txt
# Kommentarzeilen löschen
sed '/^#/d' config.conf
# Zeile 5 löschen
sed '5d' datei.txt
# Zeilen 10-20 löschen
sed '10,20d' datei.txt
# Zeilen mit bestimmtem Muster löschen
sed '/DEBUG/d' log.txt
Zeilen einfügen und anhängen
# Zeile vor Zeile 3 einfügen
sed '3i\Neue Zeile' datei.txt
# Zeile nach Zeile 5 anhängen
sed '5a\Neue Zeile' datei.txt
# Vor Muster einfügen
sed '/PATTERN/i\Neue Zeile' datei.txt
Bestimmte Zeilen ausgeben
# Nur Zeile 5 ausgeben
sed -n '5p' datei.txt
# Zeilen 10-20 ausgeben
sed -n '10,20p' datei.txt
# Zeilen mit Muster ausgeben
sed -n '/ERROR/p' log.txt
Erweiterte Operationen
Mehrere Befehle kombinieren
# Mit Semikolon
sed 's/foo/bar/g; s/alt/neu/g' datei.txt
# Mit -e Option
sed -e 's/foo/bar/g' -e 's/alt/neu/g' datei.txt
# Aus Skript-Datei
sed -f befehle.sed datei.txt
Zeilen ersetzen
# Zeile 3 komplett ersetzen
sed '3c\Neue komplette Zeile' datei.txt
# Zeilen mit Muster ersetzen
sed '/OLD/c\Neue Zeile' datei.txt
Adressbereiche
# Nur in Zeilen 5-10 ersetzen
sed '5,10s/alt/neu/g' datei.txt
# Vom ersten Muster bis zum zweiten
sed '/START/,/END/s/foo/bar/g' datei.txt
# Jede zweite Zeile
sed '1~2s/alt/neu/g' datei.txt
Reguläre Ausdrücke und Gruppen
# Rückreferenzen verwenden
sed 's/\([0-9]*\)-\([0-9]*\)/\2-\1/' datei.txt
# IP-Adressen formatieren
sed -E 's/([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/IP: \1.\2.\3.\4/' network.log
# E-Mail-Adressen maskieren
sed -E 's/([a-zA-Z0-9._%+-]+)@([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/[EMAIL]/g' datei.txt
Praktische Beispiele
Konfigurationsdateien bearbeiten
# Port in Konfiguration ändern
sed -i 's/Port 22/Port 2222/' /etc/ssh/sshd_config
# Kommentar entfernen (aktivieren)
sed -i 's/^#PermitRootLogin/PermitRootLogin/' /etc/ssh/sshd_config
# Zeile am Ende hinzufügen
sed -i '$a\neue_option = wert' config.ini
Log-Dateien bereinigen
# Timestamps entfernen
sed 's/^[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9:]*//g' log.txt
# DEBUG-Zeilen entfernen und Ausgabe speichern
sed '/DEBUG/d' application.log > clean.log
# IP-Adressen anonymisieren
sed -E 's/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/XXX.XXX.XXX.XXX/g' access.log
CSV/Text-Dateien bearbeiten
# Trennzeichen ändern (Komma zu Semikolon)
sed 's/,/;/g' data.csv
# Spalten tauschen (Tab-getrennt)
sed -E 's/^([^\t]*)\t([^\t]*)/\2\t\1/' data.tsv
# Anführungszeichen entfernen
sed 's/"//g' datei.txt
HTML/XML bearbeiten
# HTML-Tags entfernen
sed 's/<[^>]*>//g' seite.html
# Bestimmtes Tag ersetzen
sed 's/<old>/<new>/g' datei.xml
Nützliche Optionen
| Option | Bedeutung |
| -n | Unterdrückt automatische Ausgabe (nur mit p-Befehl) |
| -e | Mehrere Befehle angeben |
| -i | Datei direkt bearbeiten (in-place) |
| -i.bak | Backup vor in-place-Änderung erstellen |
| -r, -E | Erweiterte reguläre Ausdrücke (ERE) |
| -f | Befehle aus Datei lesen |
Wichtige sed-Befehle
| Befehl | Funktion |
| s/alt/neu/ | Ersetzen (substitute) |
| d | Zeile löschen (delete) |
| p | Zeile ausgeben (print) |
| a\ | Zeile anhängen (append) |
| i\ | Zeile einfügen (insert) |
| c\ | Zeile ersetzen (change) |
| q | sed beenden (quit) |
| = | Zeilennummer ausgeben |
| y/abc/xyz/ | Zeichen transformieren |
# Mit grep
grep "ERROR" log.txt | sed 's/^.*ERROR: //'
# Mit find
find . -name "*.txt" -exec sed -i 's/alt/neu/g' {} \;
# Mit awk
cat datei.txt | sed 's/foo/bar/g' | awk '{print $1}'
# In Pipe-Chain
cat access.log | sed 's/GET/REQUEST/' | grep "404" | wc -l
Hinweise
sed arbeitet standardmäßig mit POSIX Basic Regular Expressions (BRE); nutze -E für erweiterte Regex
Bei -i ohne Backup-Endung werden Originaldateien unwiderruflich überschrieben
sed verarbeitet Streams; für komplexe Logik nutze
awk oder Skriptsprachen
Trennzeichen in s-Befehl kann geändert werden: s|alt|neu|g oder s#alt#neu#g
sed beendet sich nach dem ersten Match mit q-Befehl (nützlich bei großen Dateien)
Fehlerbehebung
Nicht gefunden: Prüfe Regex-Syntax; nutze -E für erweiterte Ausdrücke
Ungültige Rückreferenz: Verwende \\1 statt \1 in BRE
Datei nicht geändert: Prüfe, ob -i verwendet wurde
Unerwartete Ausgabe: Teste zuerst ohne -i, dann mit -n und p-Befehl
Siehe auch