sed — Stream-Editor zum Transformieren von Text
Text mit sed filtern und transformieren — Ersetzen, In-Place-Bearbeitung, Zeilenadressierung, Löschen und Rückbezüge für Skripte und Pipelines.
sed (Stream-Editor) liest Text Zeile für Zeile und wendet Editierbefehle an, während die Daten durchfließen – kein interaktiver Editor, keine temporären Dateien. Sein Brot-und-Butter-Geschäft ist das Suchen und Ersetzen mit s/Muster/Ersatz/, aber es löscht, fügt ein, gibt aus und ordnet Zeilen um, adressiert per Nummer oder per Regex. Du greifst immer dann darauf zurück, wenn du Konfigurationsdateien patchen, URLs umschreiben, Whitespace entfernen oder Befehlsausgaben in einer Pipeline aufbereiten musst. Dieser Guide führt vom einfachen Ersetzen über die In-Place-Bearbeitung und Zeilenadressierung bis zu Rückbezügen und den Rezepten, die du wirklich nutzt.
Grundlegendes Ersetzen
sed 's/<pattern>/<replacement>/' <file> — Ersetzt das erste Vorkommen des Musters in jeder Zeile.
sed 's/foo/bar/' input.txtsed 's/<pattern>/<replacement>/g' <file> — Ersetzt alle Vorkommen des Musters in jeder Zeile (global).
sed 's/foo/bar/g' input.txtsed 's/<pattern>/<replacement>/gi' <file> — Ersetzt alle Vorkommen, ohne Beachtung der Groß-/Kleinschreibung.
sed 's/error/warning/gi' log.txtsed 's/<pattern>/<replacement>/2' <file> — Ersetzt nur das N-te Vorkommen des Musters in jeder Zeile.
sed 's/the/THE/2' input.txtsed 's/<pattern>/<replacement>/gp' <file> — Ersetzt global und gibt nur die geänderten Zeilen aus (zusammen mit -n).
sed -n 's/error/ERROR/gp' log.txtIn-Place-Bearbeitung
sed -i 's/<pattern>/<replacement>/g' <file> — Bearbeitet die Datei in-place (ändert die Originaldatei direkt).
sed -i 's/localhost/production.example.com/g' config.ymlsed -i.bak 's/<pattern>/<replacement>/g' <file> — Bearbeitet in-place und legt ein Backup mit dem angegebenen Suffix an.
sed -i.bak 's/debug=true/debug=false/g' config.inised -i '' 's/<pattern>/<replacement>/g' <file> — Bearbeitet in-place ohne Backup (macOS-/BSD-Syntax, leeres Suffix erforderlich).
sed -i '' 's/old/new/g' config.ymlsed -i 's/<pattern>/<replacement>/g' <file1> <file2> — Bearbeitet mehrere Dateien in-place mit derselben Ersetzung.
sed -i 's/v1.0/v2.0/g' README.md CHANGELOG.mdTrennzeichen & Sonderzeichen
sed 's|<pattern>|<replacement>|g' <file> — Verwendet | statt / als Trennzeichen. Nützlich, wenn Muster Schrägstriche enthalten.
sed 's|/usr/local|/opt|g' paths.confsed 's#<pattern>#<replacement>#g' <file> — Verwendet # als Trennzeichen. Jedes Zeichen kann als Trennzeichen dienen.
sed 's#http://#https://#g' urls.txtsed 's/[[:space:]]*$//' <file> — Entfernt nachgestellten Whitespace aus jeder Zeile.
sed 's/[[:space:]]*$//' source.pysed 's/^[[:space:]]*//' <file> — Entfernt führenden Whitespace aus jeder Zeile.
sed 's/^[[:space:]]*//' messy.txtsed 's/&/\&/g; s/</\</g; s/>/\>/g' <file> — Maskiert HTML-Sonderzeichen.
sed 's/&/\&/g; s/</\</g; s/>/\>/g' input.htmlAdressierung (Zeilen gezielt ansprechen)
sed '<n>s/<pattern>/<replacement>/' <file> — Ersetzt nur in einer bestimmten Zeilennummer.
sed '3s/old/new/' config.txtsed '<n>,<m>s/<pattern>/<replacement>/g' <file> — Ersetzt in einem Zeilenbereich (von Zeile n bis Zeile m).
sed '10,20s/foo/bar/g' data.txtsed '$s/<pattern>/<replacement>/' <file> — Ersetzt nur in der letzten Zeile. $ adressiert die letzte Zeile.
sed '$s/$/;/' data.csvsed '/<regex>/s/<pattern>/<replacement>/g' <file> — Ersetzt nur in Zeilen, die auf ein Regex-Muster passen.
sed '/^#/s/TODO/DONE/g' script.shsed '/<start>/,/<end>/s/<pattern>/<replacement>/g' <file> — Ersetzt innerhalb eines durch zwei Regex-Muster definierten Bereichs.
sed '/<body>/,/<\/body>/s/class="old"/class="new"/g' page.htmlsed '1,/<pattern>/s/<old>/<new>/g' <file> — Ersetzt ab der ersten Zeile bis zum ersten Treffer eines Musters.
sed '1,/---/s/draft/published/g' post.mdsed '0~2s/<pattern>/<replacement>/g' <file> — Ersetzt in jeder 2. Zeile (GNU-sed-Schrittadresse: start~step).
sed '0~2s/^/>> /' data.txtZeilen löschen
sed '<n>d' <file> — Löscht eine bestimmte Zeile anhand ihrer Nummer.
sed '5d' data.txtsed '<n>,<m>d' <file> — Löscht einen Zeilenbereich.
sed '3,7d' data.txtsed '$d' <file> — Löscht die letzte Zeile der Datei.
sed '$d' data.txtsed '/<pattern>/d' <file> — Löscht alle Zeilen, die auf ein Muster passen.
sed '/^#/d' config.inised '/^$/d' <file> — Löscht alle Leerzeilen.
sed '/^$/d' messy.txtsed '/^[[:space:]]*$/d' <file> — Löscht alle leeren Zeilen (leer oder nur Whitespace).
sed '/^[[:space:]]*$/d' messy.txtsed '/<start>/,/<end>/d' <file> — Löscht alle Zeilen zwischen zwei Mustern (einschließlich).
sed '/BEGIN_GENERATED/,/END_GENERATED/d' output.txtsed '/<pattern>/!d' <file> — Löscht alle Zeilen, die NICHT auf ein Muster passen (umgekehrt, wie grep).
sed '/ERROR/!d' log.txtEinfügen & Anhängen
sed '<n>i\<text>' <file> — Fügt Text vor einer bestimmten Zeile ein.
sed '1i\# Configuration File' config.inised '<n>a\<text>' <file> — Hängt Text nach einer bestimmten Zeile an.
sed '5a\# New section starts here' config.inised '/<pattern>/i\<text>' <file> — Fügt Text vor Zeilen ein, die auf ein Muster passen.
sed '/\[database\]/i\# Database settings' config.inised '/<pattern>/a\<text>' <file> — Hängt Text nach Zeilen an, die auf ein Muster passen.
sed '/^server {/a\ listen 443 ssl;' nginx.confsed '<n>c\<text>' <file> — Ersetzt (ändert) eine ganze Zeile durch neuen Text.
sed '3c\new_value = true' config.inised '/<pattern>/c\<text>' <file> — Ersetzt ganze Zeilen, die auf ein Muster passen, durch neuen Text.
sed '/^debug=/c\debug=false' config.iniRückbezüge & Gruppen
sed 's/\(<pattern>\)/\1<suffix>/g' <file> — Erfasst eine Gruppe mit ( ) und referenziert sie mit \1 im Ersatz.
sed 's/\(version\)=.*/\1=2.0/' config.inised -E 's/(<pattern>)/\1<suffix>/g' <file> — Erweiterter Regex-Modus. Nutzt ( ) für Gruppen statt ( ).
sed -E 's/(version)=.*/\1=2.0/' config.inised -E 's/(<p1>)(<p2>)/\2\1/g' <file> — Vertauscht zwei erfasste Gruppen per Rückbezug.
sed -E 's/([a-z]+), ([a-z]+)/\2 \1/g' names.txtsed 's/.*/(&)/' <file> — Das & im Ersatz verweist auf den gesamten gefundenen Text.
sed 's/.*/(&)/' list.txtsed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3.\2.\1/g' <file> — Formatiert Datumsangaben von YYYY-MM-DD nach DD.MM.YYYY mit drei Gruppen um.
sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3.\2.\1/g' dates.txtAusgeben & Ausgabe steuern
sed -n '<n>p' <file> — Gibt nur eine bestimmte Zeile aus. -n unterdrückt die Standardausgabe.
sed -n '10p' data.txtsed -n '<n>,<m>p' <file> — Gibt einen Zeilenbereich aus.
sed -n '5,15p' data.txtsed -n '/<pattern>/p' <file> — Gibt nur Zeilen aus, die auf ein Muster passen (wie grep).
sed -n '/ERROR/p' log.txtsed -n '/<start>/,/<end>/p' <file> — Gibt Zeilen zwischen zwei Mustern aus (einschließlich).
sed -n '/BEGIN/,/END/p' config.txtsed -n '$=' <file> — Gibt die Gesamtzahl der Zeilen in der Datei aus (wie wc -l).
sed -n '$=' data.txtsed '/<pattern>/q' <file> — Beendet nach der Ausgabe der ersten Zeile, die auf ein Muster passt.
sed '/^END$/q' stream.txtMehrere Befehle
sed -e 's/<p1>/<r1>/g' -e 's/<p2>/<r2>/g' <file> — Wendet mehrere Ersetzungsbefehle mit -e-Flags an.
sed -e 's/foo/bar/g' -e 's/baz/qux/g' input.txtsed 's/<p1>/<r1>/g; s/<p2>/<r2>/g' <file> — Verkettet mehrere Befehle mit Semikolons.
sed 's/http/https/g; s/www\.//g' urls.txtsed -f <script_file> <file> — Liest sed-Befehle aus einer Skriptdatei (ein Befehl pro Zeile).
sed -f transforms.sed input.txtsed '{ s/<p1>/<r1>/g; s/<p2>/<r2>/g; }' <file> — Gruppiert mehrere Befehle mit geschweiften Klammern.
sed '/^title/{ s/old/new/g; s/draft/final/g; }' document.mdTransliteration
sed 'y/<source_chars>/<dest_chars>/' <file> — Transliteriert Zeichen (wie tr). Bildet jedes Zeichen eins zu eins ab.
sed 'y/abc/ABC/' input.txtsed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' <file> — Wandelt alle Großbuchstaben in Kleinbuchstaben um.
sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' input.txtHäufige Rezepte
sed -E 's/^[[:space:]]+|[[:space:]]+$//g' <file> — Entfernt führenden und nachgestellten Whitespace aus jeder Zeile.
sed -E 's/^[[:space:]]+|[[:space:]]+$//g' messy.txtsed '/^$/N;/^\n$/d' <file> — Fasst mehrere aufeinanderfolgende Leerzeilen zu einer zusammen.
sed '/^$/N;/^\n$/d' messy.txtsed 's/^/ /' <file> — Rückt jede Zeile um 4 Leerzeichen ein.
sed 's/^/ /' code.pysed '=' <file> | sed 'N;s/\n/\t/' — Stellt jeder Zeile eine Zeilennummer gefolgt von einem Tabulator voran.
sed '=' script.sh | sed 'N;s/\n/\t/'sed -E 's/([^ ]+)/"\1"/g' <file> — Setzt jedes Wort in doppelte Anführungszeichen.
sed -E 's/([^ ]+)/"\1"/g' words.txtsed -E 's/,.*//' <file> — Extrahiert das erste Feld aus einer CSV (alles vor dem ersten Komma).
sed -E 's/,.*//' data.csvsed -e :a -e '/\\$/N; s/\\\n//; ta' <file> — Verbindet Zeilen, die mit einem Backslash enden (Zeilenfortsetzung).
sed -e :a -e '/\\$/N; s/\\\n//; ta' MakefilePipelines
<command> | sed 's/<pattern>/<replacement>/g' — Nutzt sed als Filter in einer Pipeline, um Ausgaben zu transformieren.
cat /etc/passwd | sed 's/:.*//'<command> | sed -n '/<pattern>/p' — Filtert die Ausgabe, sodass nur passende Zeilen erscheinen.
env | sed -n '/^PATH/p'<command> | sed '1d' — Entfernt die erste Zeile (Kopfzeile) aus der Befehlsausgabe.
docker ps | sed '1d'<command> | sed 's/\x1b\[[0-9;]*m//g' — Entfernt ANSI-Farbcodes aus der Befehlsausgabe.
ls --color=always | sed 's/\x1b\[[0-9;]*m//g' Fazit
sed verwandelt wiederkehrende Textänderungen in Einzeiler, die du in Skripte und Pipelines einbauen kannst. Im Alltag decken s///g, das Löschen von Zeilen mit d und das gezielte Ausgeben mit -n …p die meisten Fälle ab. Die eine Option, die Respekt verdient, ist -i: Sie überschreibt die Originaldatei ohne Rückgängig-Funktion – gewöhne dir daher an, -i.bak zu schreiben, um ein Backup zu behalten, oder führe den Befehl erst ohne -i aus und prüfe die Ausgabe. Beachte die GNU-/BSD-Unterschiede: GNU-sed nimmt -i ohne Argument, BSD-/macOS-sed verlangt sed -i ''; auch Schrittadressen wie 0~2 und \x1b-Escapes sind GNU-Erweiterungen.
Weiterführende Links
- GNU-sed-Handbuch – vollständige Referenz mit allen Befehlen und Adressierungsmodi (englisch)
- ubuntuusers-Wiki: sed – deutschsprachige Einführung mit vielen Beispielen