In der Realität sehen Konfigurationsdateien selten „sauber“ aus: Kommentare, leere Zeilen, doppelte Einträge oder alte Werte machen sie unübersichtlich.
Mit sed
kannst du solche Dateien standardisieren, Werte gezielt setzen und damit Reproduzierbarkeit herstellen – perfekt für DevOps, Admins und Automatisierung.
In diesem Projekt bauen wir ein wiederverwendbares sed
-Skript, das:
- Kommentare und Leerzeilen entfernt (optional),
- veraltete Schlüssel umbenennt,
- Standardwerte setzt (falls nicht vorhanden),
- sensible Werte nicht doppelt schreibt,
- am Ende eine gut lesbare, bereinigte Datei hinterlässt.
🔹 Ausgangsdatei (Beispiel)
Datei app.conf
:
# Beispiel-Konfiguration # Server-Einstellungen host = localhost port = 8080 # Sicherheit # api_key = TEST123 timeout = 30 log_level = debug # log_level = info # Alt-Schlüssel (historisch) retries = 3
Zielzustand:
- Kommentare (beginnend mit
#
) und leere Zeilen entfernen (optional). -
log_level
auf info setzen (einheitlich). -
retries
umbenennen inretry_count
. -
api_key
nur setzen, wenn nicht vorhanden (Platzhalter). -
timeout
mindestens 60 (falls kleiner, erhöhen; hier vereinfachen wir: direkt setzen). - Am Ende einen Marker anfügen.
🔹 Das sed-Skript (cleanup.sed)
Erstelle cleanup.sed
:
# 1) Optional: Kommentare & Leerzeilen entfernen /^#/d /^[[:space:]]*$/d # 2) Whitespace um Gleichheitszeichen normieren: key = value -> key=value s/^[[:space:]]*// # führende Leerzeichen weg s/[[:space:]]*=[[:space:]]*/=/ # rund um '=' normalisieren # 3) Alt-Schlüssel umbenennen: retries -> retry_count s/^retries=/retry_count=/ # 4) log_level vereinheitlichen: egal was dort steht -> log_level=info /^log_level=/c\log_level=info # 5) timeout festsetzen (vereinfachte Regel) # Wenn Zeile 'timeout=' existiert, setzen wir sie hart auf 60. /^timeout=/c\timeout=60 # 6) api_key nur hinzufügen, wenn nicht vorhanden # Trick: prüfe, ob irgendwo 'api_key=' existiert; wenn nein, am Dateiende einfügen. /^api_key=/!{ $a\api_key=CHANGE_ME } # 7) Doppelte Schlüssel entfernen (z. B. mehrfach definierte log_level) # Behalte erstes Auftreten, lösche spätere: # Ansatz: Sobald ein Schlüssel nochmals auftaucht, löschen. /^log_level=/{ x /LOGLEVEL_SEEN/{ x d } x s/.*/LOGLEVEL_SEEN/ } /^retry_count=/{ x /RETRY_SEEN/{ x d } x s/.*/RETRY_SEEN/ } /^timeout=/{ x /TIMEOUT_SEEN/{ x d } x s/.*/TIMEOUT_SEEN/ } /^api_key=/{ x /APIKEY_SEEN/{ x d } x s/.*/APIKEY_SEEN/ } # 8) Am Ende Marker anhängen (zur Nachverfolgung) $ a\# standardized by sed (cleanup.sed)
💡 Hinweis zu Abschnitt 7 (Duplikate):
Wir benutzen den Hold-Space (x
tauscht Pattern- und Hold-Space).
Beim ersten Auftreten eines Schlüssels setzen wir im Hold-Space ein „Flag“ (z. B.LOGLEVEL_SEEN
).
Beim nächsten Auftreten desselben Schlüssels finden wir das Flag und löschen die Zeile (d
).
So bleibt nur die erste Definition erhalten.
🔹 Ausführen & Absichern
Trockenlauf (nur Ausgabe):
sed -f cleanup.sed app.conf
In-Place mit Backup:
sed -i.bak -f cleanup.sed app.conf # -> Original in app.conf.bak
Vorher/Nachher vergleichen:
diff -u app.conf.bak app.conf
🔹 Ergebnis (bereinigt)
Beispielausgabe nach dem Skript:
host=localhost port=8080 timeout=60 log_level=info retry_count=3 api_key=CHANGE_ME # standardized by sed (cleanup.sed)
- Kommentare & Leerzeilen raus
- Whitespace vereinheitlicht
-
retries
→retry_count
-
timeout
= 60 -
log_level
= info -
api_key
gesetzt, falls zuvor nicht vorhanden - Marker ergänzt
🔹 Varianten & Erweiterungen
-
Kommentare behalten, aber normalisieren:
Lass die ersten zwei Zeilen (Header) stehen:1,2!{/^#/d}
-
Nur bestimmte Kommentararten löschen:
/^[[:space:]]*#/d
-
Nur Sektionen bearbeiten:
Zwischen Markern (z. B.[security]
… nächste Sektion) gezielt ändern:/^\[security\]/,/^\[/ s/^timeout=.*/timeout=120/
-
Schlüssel setzen, wenn Zeile fehlt (ohne Hold-Space):
/^(?!)/{ $a\key=value } # sed hat kein (?!) – nutze Musternegation: /^key=/!{ $a\key=value }
🔹 Übungen
1. Minimal-Variante bauen:
- Entferne nur Kommentare & Leerzeilen.
- Vereinheitliche
key = value
→key=value
. - Setze
log_level=warning
, wenn keinen vorhanden.
Tipp:^log_level=
prüfen und ggf. am Ende anfügen.
2. Sektionale Anpassung:
Datei mit Sektionen ([server]
, [security]
):
- In
[security]
setzetimeout=120
. - Lösche dort alle Zeilen mit
debug=true
.
Tipp: Bereichsadressierung^\[security\]/, /^\[/
.
3. Duplikate robust handhaben:
- Erweitere den Duplikat-Teil für einen weiteren Schlüssel
port=
. - Behalte nur das erste Auftreten.
4. Dry-Run vs. In-Place:
- Führe zuerst Trockenlauf aus, speichere Ausgabe in
preview.conf
. - Vergleiche mit
diff
. - Wenn ok, dann
-i.bak
.
✅ Zusammenfassung
- Mit einem sed-Skript kannst du Konfigurationsdateien reproduzierbar standardisieren.
- Typische Schritte: Kommentare/Leerzeilen entfernen, Whitespace normieren, Schlüssel umbenennen, Defaults setzen, Duplikate abräumen.
- Der Hold-Space erlaubt einfache „Flags“, um doppelte Schlüssel zu erkennen und nur das erste Auftreten zu behalten.
- Immer zuerst ohne
-i
testen, dann mit Backup anwenden – sicher und kontrolliert.
👉 Im Bonus Kapitel starten wir mit Profi-Tipps & Best Practis
📚 Inhaltsverzeichnis
👉 sed Kapitel 1: Grundlagen von sed – erste Ersetzungen & Konzepte
👉 sed Kapitel 2: Suchen & Ersetzen mit sed – Grundlagen & Regex
👉 sed Kapitel 3: Zeilen bearbeiten mit sed
👉 sed Kapitel 4: sed-Skripte schreiben & kombinieren
👉 sed Kapitel 5: sed in Kombination mit anderen Tools
👉 sed Kapitel 6: Praxisprojekt – Konfigurationsdateien automatisch bereinigen & anpassen
⭐ Bonus-Kapitel
👉 sed Kapitel 7: Bonus – Profi-Tipps & Best Practices für sed im Alltag