Grundlagen der sed-Ersetzung

LinuxBeginner
Jetzt üben

Einführung

Eine häufige Aufgabe bei der Textverarbeitung ist „Suchen und Ersetzen“. In Textverarbeitungsprogrammen erfolgt dies interaktiv. In Linux-Umgebungen auf der Kommandozeile übernimmt sed dieselbe Aufgabe skriptgesteuert und nicht interaktiv.

sed ist ein nicht interaktiver Texteditor, der Text zeilenweise verarbeitet. Besonders leistungsfähig ist er bei Ersetzungen, wenn bestimmte Muster durch neuen Text ersetzt werden sollen. Das ist für die Automatisierung nützlich, weil niemand vor einem Editor sitzen und dieselbe Änderung wiederholt durchführen muss.

In diesem Lab lernen Sie:

  1. Text ersetzen (s): Einfache Suchen-und-Ersetzen-Vorgänge durchführen.
  2. Globale Ersetzung (g): Alle Vorkommen eines Musters in einer Zeile ersetzen, nicht nur das erste.
  3. Benutzerdefinierte Trennzeichen verwenden: Text mit Schrägstrichen, etwa Dateipfade, mithilfe alternativer Trennzeichen verarbeiten.
  4. Direkte Bearbeitung mit Sicherungskopien: Dateien sicher ändern, indem automatisch Sicherungskopien erstellt werden.

Grundlegende Ersetzung

Beginnen Sie mit einer einfachen Ersetzung in einer Zeichenfolge. Ersetzen Sie das Wort „World“ durch „Linux“.

Der Ersetzungsbefehl in sed lautet s.

Die Syntax ist s/Pattern/Replacement/.

Diese Befehlsform ist so verbreitet, dass viele sed als „Suchen-und-Ersetzen-Werkzeug“ betrachten. Tatsächlich handelt es sich um einen Stream-Editor. Die Ersetzung ist lediglich einer seiner am häufigsten verwendeten Editierbefehle.

Führen Sie diesen Befehl aus, um die Funktionsweise zu sehen:

echo "Hello World" | sed 's/World/Linux/'

So funktioniert der Befehl:

  1. echo sendet „Hello World“ an die Standardausgabe.
  2. Die Pipe | übergibt diese Ausgabe an sed.
  3. sed liest den Text, sucht nach dem Muster „World“, ersetzt es durch „Linux“ und gibt das Ergebnis aus.

Hinweis: Dieser Befehl ändert die ursprüngliche Quelle nicht dauerhaft. Er gibt den bearbeiteten Text lediglich auf dem Bildschirm aus (Standard Output).

Dieser Unterschied ist entscheidend für eine sichere Bearbeitung über die Kommandozeile. Im Unix-Stil zeigen Werkzeuge häufig zuerst einen umgewandelten Datenstrom an. Erst danach entscheiden Sie, ob Sie das Ergebnis speichern oder umleiten möchten.

Globale Ersetzung

Standardmäßig ersetzt sed in jeder Zeile nur das erste gefundene Vorkommen.

Wenn der Text „apple apple“ lautet und Sie „apple“ durch „orange“ ersetzen, gibt sed „orange apple“ aus.

Um alle Vorkommen in einer Zeile zu ersetzen, müssen Sie am Ende des Ersetzungsbefehls das globale Flag (g) verwenden.

Wichtig ist dabei die Formulierung „in jeder Zeile“. sed verarbeitet jeweils eine Zeile. Das Flag g wirkt daher auf alle Treffer innerhalb der aktuellen Zeile und nicht auf die gesamte Datei als einen einzigen großen Textblock.

Überprüfen Sie zunächst die Beispieldatei quote.txt:

cat quote.txt

Ausgabe: I love Coding. Coding is fun.

Versuchen Sie nun, „Coding“ ohne das globale Flag durch „Programming“ zu ersetzen:

sed 's/Coding/Programming/' quote.txt

Ergebnis: I love Programming. Coding is fun.
Beachten Sie, dass das zweite Vorkommen von „Coding“ nicht ersetzt wurde.

Fügen Sie nun das Flag g hinzu:

sed 's/Coding/Programming/g' quote.txt

Ergebnis: I love Programming. Programming is fun.
Jetzt wurden beide Vorkommen erfolgreich ersetzt.

Andere Trennzeichen verwenden

Die Standardsyntax von sed verwendet Schrägstriche / als Trennzeichen: s/old/new/.

Wenn der zu ersetzende Text jedoch Schrägstriche enthält, etwa ein Dateipfad wie /usr/local/bin, müssten Sie jeden Schrägstrich mit einem umgekehrten Schrägstrich maskieren. Dadurch wird der Befehl schwer lesbar: s/\/usr\/local\/bin/\/bin/.

Glücklicherweise können Sie in sed fast jedes Zeichen als Trennzeichen verwenden. Häufige Alternativen sind #, : oder |.

Ein gut lesbares Trennzeichen zu wählen, ist eine praktische Fähigkeit und nicht nur ein Syntaxtrick. Wenn Muster viele / enthalten, wird der Befehl durch ein anderes Trennzeichen übersichtlicher und weniger fehleranfällig.

Erstellen Sie eine Datei mit einem Pfad:

echo "/usr/local/bin" > path.txt

Ersetzen Sie nun /usr/local/bin durch /bin und verwenden Sie # als Trennzeichen:

sed 's#/usr/local/bin#/bin#' path.txt

Ergebnis: /bin

Da wir # als Trennzeichen verwendet haben, behandelt sed die / im Pfad als normalen Text. Dadurch ist der Befehl deutlich übersichtlicher und leichter zu lesen.

Direkte Bearbeitung mit Sicherungskopie

Bisher hat sed die Änderungen nur auf dem Bildschirm ausgegeben. Um eine Datei direkt zu ändern („in-place“), verwenden Sie die Option -i.

Das direkte Ändern von Dateien kann jedoch riskant sein. Wenn Ihr Muster fehlerhaft ist, könnten Daten verloren gehen. Idealerweise erstellen Sie daher vor der Änderung eine Sicherungskopie der Originaldatei.

Dazu geben Sie eine Erweiterung für die Option -i an, zum Beispiel -i.bak.

Ändern Sie quote.txt und erstellen Sie automatisch eine Sicherungskopie mit dem Namen quote.txt.bak.

sed -i.bak 's/fun/awesome/' quote.txt

Überprüfen Sie nun den Inhalt der geänderten Datei:

cat quote.txt

Ergebnis: I love Coding. Coding is awesome.

Prüfen Sie anschließend, ob die Sicherungskopie vorhanden ist und den ursprünglichen Text enthält:

ls -l quote.txt.bak
cat quote.txt.bak

Ergebnis: I love Coding. Coding is fun.

Das ist eine bewährte Vorgehensweise, wenn Sie Stapeländerungen an mehreren Dateien durchführen.

Diese Gewohnheit ist wichtig, weil nicht interaktive Änderungen zwar schnell, aber unerbittlich sind. Wenn Sie Textersetzungen über mehrere Dateien hinweg automatisieren, kann sich ein kleiner Fehler im Muster schnell ausbreiten. Eine Kopie des Originals aufzubewahren, ist daher eine einfache Sicherheitsmaßnahme.

Zusammenfassung

In diesem Lab haben Sie die Grundlagen der Textersetzung mit sed kennengelernt:

  1. Ersetzung (s///): Der Standardbefehl zum Suchen und Ersetzen von Text.
  2. Globales Flag (g): Alle Vorkommen eines Musters in einer Zeile ersetzen.
  3. Benutzerdefinierte Trennzeichen: Zeichen wie # verwenden, um Pfade und URLs mit / sicher zu verarbeiten.
  4. Sicherung bei direkter Bearbeitung (-i.bak): Dateien sicher ändern und dabei den ursprünglichen Inhalt erhalten.

Mit diesen Kenntnissen können Sie komplexe Aufgaben der Textverarbeitung effizient und sicher automatisieren.