Finden und ersetzen komplexe Zeichenketten mithilfe von Sed mit Regex
-
Suchen und Ersetzen von Strings mit
sedin Bash -
Suchen und ersetzen Sie das Trennzeichen
/in einer Zeichenfolge in Bash - Alle Zahlen finden und durch die Zeichenkette Number in Bash ersetzen
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
-eist die Ausgabe von sed, die standardmäßig auf die Standardausgabe geschrieben wird. Dieser Parameter weistsedan, 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_Regexist ein Suchbegriff. Wir werden einenregexoder einen regulären String verwenden. - Die
substitutionwird als Zeichenfolge zum Ersetzen verwendet. - Das
gist ein Flag für globale Substitution. Dersedliest die Datei standardmäßig Zeile für Zeile und ändert nur das erste Vorkommen derSearch_Regexin jeder Zeile. Alle Instanzen werden ersetzt, wenn das Ersetzungs-Flag gesetzt ist. - Der
Dateinameist 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.