Sed Masterclass: Stream Editor (Artikel 254)
Tiefgehender Einstieg in den Stream Editor sed. Erfahren Sie alles über Suchen-und-Ersetzen, In-place Editing von Konfigurationsdateien und komplexe Text-Transformationen.
# Sed Mastery: Text-Manipulation im Vorbeifliegen
TL;DR / Management Summary sed (Stream Editor) ist das Skalpell für Textdaten. Im Gegensatz zu einem Texteditor wie Vim arbeitet
sednicht interaktiv, sondern als Filter. Er liest eine Eingabe, transformiert sie nach festen Regeln und gibt sie wieder aus. Ein Senior Admin nutztsed, um hunderte Konfigurationsdateien in einem Rutsch zu ändern, unbenötigte Zeilen zu löschen oder Passwörter in Skripten dynamisch zu ersetzen.
# 1. Einführung & Architektur
Transformation am Datenstrom.
Sed arbeitet zeilenweise. Jede Zeile wird in den “Pattern Space” geladen, dort bearbeitet und dann ausgegeben.
# Der Sed-Workflow (Mermaid)
graph LR
A[Input: File / Pipe] --> B{Sed Engine}
B --> C[Read Line into Pattern Space]
C --> D[Apply Command: e.g. s/old/new/]
D --> E[Output Line]
E --> F[Repeat for next line]
subgraph "Advanced"
G[Hold Space: Secondary Buffer]
end
C <--> G
# 2. Der Klassiker: Suchen und Ersetzen
Die Syntax: s/find/replace/flags.
# Einfaches Ersetzen
# Ersetzt 'localhost' durch '127.0.0.1' (nur erstes Vorkommen pro Zeile)
sed 's/localhost/127.0.0.1/' config.txt
# Globales Ersetzen (alle Vorkommen)
sed 's/old/new/g' config.txt
# In-place Editing (Die Datei direkt ändern)
Vorsicht: -i ändert die Datei permanent. Erstellen Sie immer ein Backup!
# Erstellt automatisch 'config.txt.bak' und ändert das Original
sed -i.bak 's/DEBUG=true/DEBUG=false/' config.txt
# 3. Zeilen-Adressierung
Präzision statt Gießkanne.
Sie können sed sagen, auf welche Zeilen der Befehl angewendet werden soll.
# Bestimmte Zeilen löschen
# Zeile 5 löschen
sed '5d' data.txt
# Erste bis zehnte Zeile löschen
sed '1,10d' data.txt
# Alle Zeilen außer denen mit 'ERROR' löschen
sed '/ERROR/!d' system.log
# 4. Day-2 Operations: Fortgeschrittene Tricks
Mehr als nur s///.
# Variablen in Sed nutzen
Nutzen Sie doppelte Anführungszeichen, damit die Shell die Variable expandiert:
NEW_IP="10.0.0.5"
sed -i "s/IP_ADDR=.*/IP_ADDR=$NEW_IP/" server.conf
# Alternative Trennzeichen
Wenn Sie Pfade ersetzen wollen, wird s/old/new/ unlesbar durch Backslashes. Nutzen Sie ein anderes Zeichen:
# Statt s/\/var\/www/\/data\/www/
sed 's|/var/www|/data/www|' config.conf
# 5. Troubleshooting & “War Stories”
Wenn sed zu viel frisst.
# Story 1: “Der gierige Punkt”
Symptom: sed 's/ID=.*//' löscht die gesamte Zeile, obwohl nur der Teil nach dem Gleichheitszeichen weg sollte.
Ursache: .* ist “greedy” (gierig) und matcht so viel wie möglich bis zum Zeilenende.
Lösung: Seien Sie spezifischer, z.B. sed 's/ID=[^ ]*//' (löscht bis zum nächsten Leerzeichen).
# Story 2: “Mac vs. Linux Sed”
Symptom: Ein Skript mit sed -i funktioniert auf Debian, bricht aber auf dem MacBook des Admins ab.
Ursache: macOS nutzt die BSD-Version von sed, die ein obligatorisches Argument für -i (Backup-Extension) verlangt.
Lösung: Nutzen Sie sed -i '' 's/.../' auf dem Mac oder installieren Sie gsed (GNU Sed) via Homebrew für volle Kompatibilität.
# 6. Fazit & Empfehlung
- Sicherheit: Nutzen Sie immer
-i.bak, wenn Sie Dateien automatisiert ändern. - Lesbarkeit: Bei sehr komplexen Transformationen (mehrere Befehle hintereinander) ist awk (Artikel 255) oft lesbarer.
- Wahl: Sed ist unschlagbar für schnelle 1-Zeilen-Änderungen in Deployment-Skripten.
# Anhang: Cheatsheet
| Aufgabe | Befehl |
|---|---|
| Suchen & Ersetzen | s/find/replace/g |
| Zeile löschen | nd (n = Zeilennummer) |
| Zeile drucken | -n 'np' |
| Am Zeilenanfang einfügen | s/^/Prefix / |
| Am Zeilenende einfügen | s/$/ Suffix/ |
| Mehrere Befehle | -e 'cmd1' -e 'cmd2' |
| Case Insensitive | s/find/replace/I |
| Nur Treffer-Zeilen zeigen | sed -n '/pattern/p' |