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_levelauf info setzen (einheitlich).retriesumbenennen inretry_count.api_keynur setzen, wenn nicht vorhanden (Platzhalter).timeoutmindestens 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 (xtauscht 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_counttimeout= 60log_level= infoapi_keygesetzt, 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
-itesten, 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
