From C to Python by Ross Rheingans-Yoo
Inhaltsverzeichnis:
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 schreibtsed
seine Ausgabe in die Standardausgabe. Diese Option weistsed
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 liestsed
die Datei zeilenweise und ändert nur das erste Vorkommen vonSEARCH_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
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 terminalSuchen und Ersetzen von Text in mehreren Dateien unter Windows
Suchen und Ersetzen-Tool wird Ihnen helfen, Text in mehreren zu suchen und zu ersetzen Dateien in großen Mengen. Geben Sie einfach den Text ein und klicken Sie auf Ersetzen, um den Text sofort zu ersetzen.
Suchen und Ersetzen von Text in mehreren Dateien gleichzeitig mit FAR-Software
Wenn Sie Text in mehreren Dateien suchen und ersetzen müssen Verwenden Sie auf Ihrem Windows-PC FAR oder die Software zum Suchen und Ersetzen. Es erstellt automatisch Backups!
Verwendung von skydrive zum Abrufen von Dateien von Ihrem PC aus der Ferne
Wussten Sie, dass Sie mit SkyDrive nahezu jede Datei von Ihrem Heim-PC aus fernabrufen können? Es ist ziemlich ordentlich. Schau dir die Schritte an!