====== 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 [[sammlung:bash_kommandos|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///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 ''-E'' für erweiterte Regex
* Bei ''-i'' ohne Backup-Endung werden Originaldateien unwiderruflich überschrieben
* sed verarbeitet Streams; für komplexe Logik nutze [[sammlung:awk|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 =====
* [[sammlung:grep|grep - Text durchsuchen]]
* [[sammlung:awk|awk - Textverarbeitung und Datenextraktion]]
* [[sammlung:bash_kommandos|Bash Kommandos Übersicht]]
* [[sammlung:vim|vim - Texteditor mit erweiterten Funktionen]]
{{tag>linux kommandozeile text editor manipulation regex automatisierung}}