sammlung:sed
Inhaltsverzeichnis
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
- Zugriff auf die Linux-Kommandozeile
- Grundkenntnisse in Bash-Kommandos
- Optional: Verständnis für reguläre Ausdrücke
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 |
Kombination mit anderen Tools
# 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
-Efür erweiterte Regex - Bei
-iohne 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|goders#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
-Efür erweiterte Ausdrücke - Ungültige Rückreferenz: Verwende
\\1statt\1in BRE - Datei nicht geändert: Prüfe, ob
-iverwendet wurde - Unerwartete Ausgabe: Teste zuerst ohne
-i, dann mit-nundp-Befehl
Siehe auch
sammlung/sed.txt · Zuletzt geändert: von 127.0.0.1
