Android

Verwendung von sed zum Suchen und Ersetzen von Zeichenfolgen in Dateien

From C to Python by Ross Rheingans-Yoo

From C to Python by Ross Rheingans-Yoo

Inhaltsverzeichnis:

Anonim

Sehr oft müssen Sie beim Arbeiten mit Textdateien Textfolgen in einer oder mehreren Dateien suchen und ersetzen.

sed is a s tream ed itor. Es kann grundlegende Textmanipulationen an Dateien und Eingabestreams wie Pipelines durchführen. Mit sed Sie Wörter und Zeilen suchen, suchen und ersetzen, einfügen und löschen. Es unterstützt einfache und erweiterte reguläre Ausdrücke, mit denen Sie komplexe Muster abgleichen können.

Wir werden darüber sprechen, wie man Saiten mit sed findet und ersetzt. Wir zeigen Ihnen auch, wie Sie rekursiv suchen und ersetzen.

Suchen und Ersetzen von String mit sed

Es gibt verschiedene Versionen von sed mit einigen funktionellen Unterschieden. macOS verwendet die BSD-Version und die meisten Linux-Distributionen werden standardmäßig mit vorinstalliertem GNU sed . Wir werden die GNU-Version verwenden.

Die allgemeine Form des Suchens und Ersetzens von Text mit sed hat folgende Form:

sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE

  • -i - Standardmäßig schreibt sed seine Ausgabe in die Standardausgabe. Diese Option weist sed an, Dateien an Ort und Stelle zu bearbeiten. Wenn eine Erweiterung angegeben wird (ex -i.bak), wird eine Sicherungskopie der Originaldatei erstellt. s - Der Ersatzbefehl, wahrscheinlich der am häufigsten verwendete Befehl in sed. / / / - Trennzeichen. Es kann sich um ein beliebiges Zeichen handeln, in der Regel wird jedoch der Schrägstrich ( / ) verwendet. SEARCH_REGEX - Normale Zeichenfolge oder ein regulärer Ausdruck, nach dem gesucht werden soll. REPLACEMENT - Die Ersatzzeichenfolge. g - Globale Ersatzflagge. Standardmäßig liest sed die Datei zeilenweise und ändert nur das erste Vorkommen von SEARCH_REGEX in einer Zeile. Wenn das Ersetzungsflag bereitgestellt wird, werden alle Vorkommen ersetzt. INPUTFILE - Der Name der Datei, für die Sie den Befehl ausführen möchten.

Es wird empfohlen, das Argument in Anführungszeichen zu setzen, damit die Shell-Metazeichen nicht erweitert werden.

Nachfolgend finden Sie Beispiele für die Verwendung des Befehls sed zum Suchen und Ersetzen von Text in Dateien durch einige der am häufigsten verwendeten Optionen und Flags.

Zu Demonstrationszwecken verwenden wir die folgende Datei:

file.txt

123 Foo foo foo foo /bin/bash Ubuntu foobar 456

sed -i 's/foo/linux/' file.txt

123 Foo linux foo linux /bin/bash Ubuntu foobar 456

Mit dem globalen Ersetzungs-Flag sed alle Vorkommen des Suchmusters ersetzt:

sed -i 's/foo/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu linuxbar 456

Wie Sie vielleicht bemerkt haben, wird im vorherigen Beispiel auch der Teilstring foo in der foobar Zeichenfolge ersetzt. Wenn dies nicht das gewünschte Verhalten ist, verwenden Sie den Wortbegrenzungsausdruck ( \b ) an beiden Enden der Suchzeichenfolge. Dies stellt sicher, dass die Teilwörter nicht übereinstimmen.

sed -i 's/\bfoo\b/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu foobar 456

Verwenden Sie das I Flag, um die Groß- und Kleinschreibung der I ignorieren. Im folgenden Beispiel verwenden wir die Flags g und I :

sed -i 's/foo/linux/gI' file.txt

123 linux linux linux linux /bin/bash Ubuntu linuxbar 456

sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt

Die einfachere und besser lesbare Option ist die Verwendung eines anderen Begrenzungszeichens. Die meisten Leute benutzen die vertikale Leiste ( | ) oder den Doppelpunkt (:), aber Sie können jedes andere Zeichen verwenden:

sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt

123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456

Sie können auch reguläre Ausdrücke verwenden. Zum Beispiel, um alle 3-stelligen Zahlen zu suchen und durch die Zeichenfolgennummer zu ersetzen, die Sie verwenden würden:

sed -i 's/\b\{3}\b/number/g' file.txt

number Foo foo foo foo /bin/bash demo foobar number

Eine weitere nützliche Funktion von sed ist, dass Sie das kaufmännische Und-Zeichen & das dem übereinstimmenden Muster entspricht. Das Zeichen kann mehrfach verwendet werden.

Wenn Sie beispielsweise geschweifte Klammern {} um jede dreistellige Zahl einfügen möchten, geben Sie Folgendes ein:

sed -i 's/\b\{3}\b/{&}/g' file.txt

{123} Foo foo foo foo /bin/bash demo foobar {456}

Last but not least ist es immer eine gute Idee, ein Backup zu erstellen, wenn Sie eine Datei mit sed bearbeiten. Geben Sie dazu einfach eine Erweiterung für die Option -i . Um beispielsweise die Datei file.txt.bak zu bearbeiten und die ursprüngliche Datei als file.txt.bak speichern, würden Sie file.txt.bak verwenden:

sed -i.bak 's/foo/linux/g' file.txt

ls

file.txt file.txt.bak

Rekursives Suchen und Ersetzen

Manchmal möchten Sie Verzeichnisse rekursiv nach Dateien durchsuchen, die eine Zeichenfolge enthalten, und die Zeichenfolge in allen Dateien ersetzen. Dies kann erreicht werden, indem Befehle wie find oder grep um rekursiv nach Dateien im Verzeichnis zu suchen und die Dateinamen an sed .

Der folgende Befehl sucht rekursiv nach Dateien im aktuellen Arbeitsverzeichnis und übergibt die Dateinamen an sed .

find. -type f -exec sed -i 's/foo/bar/g' {} +

Um Probleme mit Dateien zu vermeiden, deren Namen Leerzeichen enthalten, verwenden Sie die Option -print0 der find -print0 wird find den Dateinamen zu drucken, gefolgt von einem Nullzeichen, und leiten Sie die Ausgabe mit xargs -0 an sed :

find. -type f -print0 | xargs -0 sed -i 's/foo/bar/g'

Um ein Verzeichnis auszuschließen, verwenden Sie die Option -not -path . Wenn Sie beispielsweise eine Zeichenfolge in Ihrem lokalen Git-Repository ersetzen, um alle Dateien auszuschließen, die mit einem Punkt ( . ) Beginnen, verwenden Sie Folgendes:

find. -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'

find. -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'

Eine andere Möglichkeit besteht darin, den Befehl grep zu verwenden, um rekursiv alle Dateien zu finden, die das Suchmuster enthalten, und dann die Dateinamen an sed :

grep -rlZ 'foo'. | xargs -0 sed -i.bak 's/foo/bar/g'

Fazit

Obwohl es kompliziert und komplex erscheinen mag, ist das Suchen und Ersetzen von Text in Dateien mit sed sehr einfach.

Weitere Informationen zu sed-Befehlen, -Optionen und -Flaggen finden Sie im GNU sed-Handbuch und im Grymoire sed-Tutorial. Wenn Sie Fragen oder Feedback haben, können Sie gerne einen Kommentar hinterlassen.

sed terminal