Finden und ersetzen komplexe Zeichenketten mithilfe von Sed mit Regex
-
Suchen und Ersetzen von Strings mit
sed
in 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
-e
ist die Ausgabe von sed, die standardmäßig auf die Standardausgabe geschrieben wird. Dieser Parameter weistsed
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 einenregex
oder einen regulären String verwenden. - Die
substitution
wird als Zeichenfolge zum Ersetzen verwendet. - Das
g
ist ein Flag für globale Substitution. Dersed
liest die Datei standardmäßig Zeile für Zeile und ändert nur das erste Vorkommen derSearch_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.