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:

  1. Kommentare und Leerzeilen entfernt (optional),
  2. veraltete Schlüssel umbenennt,
  3. Standardwerte setzt (falls nicht vorhanden),
  4. sensible Werte nicht doppelt schreibt,
  5. 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 in retry_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
  • retriesretry_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 = valuekey=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] setze timeout=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