linux-cli-shell cli text-processing sed automation advanced

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 sed nicht interaktiv, sondern als Filter. Er liest eine Eingabe, transformiert sie nach festen Regeln und gibt sie wieder aus. Ein Senior Admin nutzt sed, 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'