Finden und ersetzen komplexe Zeichenketten mithilfe von Sed mit Regex

Nilesh Katuwal 30 Januar 2023
  1. Suchen und Ersetzen von Strings mit sed in Bash
  2. Suchen und ersetzen Sie das Trennzeichen / in einer Zeichenfolge in Bash
  3. Alle Zahlen finden und durch die Zeichenkette Number in Bash ersetzen
Finden und ersetzen komplexe Zeichenketten mithilfe von Sed mit Regex

Bei der Arbeit mit Textdateien müssen Sie häufig Textzeichenfolgen in einer oder mehreren Dateien identifizieren und ersetzen.

sed ist ein Stream-Editor. Es kann rudimentäre Textmanipulationen an Dateien und Eingabeströmen wie Pipelines durchführen. Mit sed können Sie Wörter und Zeilen suchen, finden, ersetzen, einfügen und löschen.

Grundlegende und erweiterte regex werden unterstützt, sodass Sie komplexe Muster abgleichen können. In diesem Beitrag sehen wir uns an, wie man mit sed Strings findet und ersetzt. Wir zeigen auch, wie Sie rekursives Suchen und Ersetzen verwenden.

Suchen und Ersetzen von Strings mit sed in Bash

Es gibt verschiedene Versionen von sed, jede mit ihren eigenen Eigenschaften.

Linux-Distributionen haben standardmäßig GNU sed vorinstalliert, aber Mac OS verwendet die BSD-Version. Wir werden die GNU-Version verwenden.

Die Syntax wird zum Suchen und Ersetzen von Text mit sed verwendet:

sed -e 's/Search_Regex/substitution/g' Filename

In der oben verwendeten Syntax sind die folgenden Definitionen:

  • Das -e ist die Ausgabe von sed, die standardmäßig auf die Standardausgabe geschrieben wird. Dieser Parameter weist sed an, Dateien an ihrem aktuellen Speicherort zu bearbeiten. Wenn eine Erweiterung definiert ist, wird eine Ersatzdatei generiert.
  • Das /// ist ein Zeichen, das als Trennzeichen dient. Obwohl die meisten Leute den Schrägstrich (/) verwenden, kann es sich um ein beliebiges Zeichen handeln.
  • Der Search_Regex ist ein Suchbegriff. Wir werden einen regex oder einen regulären String verwenden.
  • Die substitution wird als Zeichenfolge zum Ersetzen verwendet.
  • Das g ist ein Flag für globale Substitution. Der sed liest die Datei standardmäßig Zeile für Zeile und ändert nur das erste Vorkommen der Search_Regex in jeder Zeile. Alle Instanzen werden ersetzt, wenn das Ersetzungs-Flag gesetzt ist.
  • Der Dateiname ist der Name der Datei, die den Befehl ausführen soll.

Schauen wir uns die häufig verwendeten Parameter und Flags für die Verwendung des Befehls sed an, um Text in Dateien zu suchen und zu ersetzen. Wir verwenden die von uns erstellte Beispieldatei live.txt zu Demonstrationszwecken.

live.txt 
Omicron is the endgame of Covid and Omicron 9876

Wenn das Flag g ignoriert wird, wird nur die erste Instanz des Suchstrings in jeder Zeile ersetzt.

$ sed -e 's/endgame/infinitywar/' live.txt

Ausgabe:

Omicron is the infinitywar of Covid and Omicron 9876

Das sed ersetzt alle Vorkommen des Suchmusters durch das globale Ersatz-Flag:

$ sed -e 's/Omicron/thanos/g' live.txt

Ausgabe:

thanos is the endgame of Covid and thanos 9876

Wie Sie vielleicht bemerkt haben, wurde die Zeichenfolge Omicron durch thanos ersetzt.

Suchen und ersetzen Sie das Trennzeichen / in einer Zeichenfolge in Bash

Sie müssen den Backslash \ als Escapezeichen für den Schrägstrich verwenden, wenn Sie eine Zeichenfolge suchen und ersetzen möchten, die das Trennzeichen / enthält. Um beispielsweise /bin/bash durch /usr/bin/zsh zu ersetzen, verwenden Sie Folgendes:

$ sed -e 's/\/bin\/bash/\/usr\/bin\/zsh/g' live.txt

Ausgabe:

Omicron is the endgame of Covid and Omicron 9876

Machen wir es mit einem senkrechten Strich | verständlicher oder ein Doppelpunkt :, obwohl jedes andere Zeichen ausreicht.

$ sed -e 's|/bin/bash|/usr/bin/zsh|g' live.txt

Ausgabe:

Omicron is the endgame of Covid and Omicron 9876

Wie Sie sehen können, ist das Ergebnis identisch mit dem vorherigen.

Alle Zahlen finden und durch die Zeichenkette Number in Bash ersetzen

Reguläre Ausdrücke können auch alle vier Zahlen finden und durch die Zeichenkettenzahl ersetzen. Beispielsweise:

$ sed -e 's/\b[0-9]\{4\}\b/number/g' live.txt

Ausgabe:

Omicron is the endgame of Covid, and Omicron number

Wie Sie sehen können, wird die 9876 durch die Zeichenfolge Nummer ersetzt.

Last but not least, wann immer Sie mit sed eine Datei bearbeiten, sollten Sie immer eine Sicherungskopie erstellen. Geben Sie der Option -i eine Erweiterung für die Sicherungsdatei, um dies zu erreichen.

Bearbeiten Sie beispielsweise live.txt und speichern Sie die Originaldatei als live.txt. Wenn Sie bak verwenden würden, würden Sie das tun, indem Sie:

$ sed -i.bak 's/Omicron/thanos/g' live.txt

Listen Sie die Dateien mit dem Befehl ls auf, um sicherzustellen, dass das Backup erstellt wurde:

$ ls

Ausgabe:

live.txt
live.txt.bak 

Auch wenn es zunächst kompliziert erscheinen mag, ist das Auffinden und Ändern von Text in Dateien mit sed relativ einfach.