Wenn Sie mit Textdateien arbeiten, müssen Sie häufig Textzeichenfolgen in einer oder mehreren Dateien suchen und ersetzen.
sed
ist ein stream-editor. Es kann grundlegende Textmanipulationen an Dateien und Eingabeströmen wie Pipelines durchführen. Mit sed
können Sie Wörter und Zeilen suchen, suchen und ersetzen, einfügen und löschen. Es unterstützt grundlegende und erweiterte reguläre Ausdrücke, mit denen Sie komplexe Muster abgleichen können.,
In diesem Artikel werden wir darüber sprechen, wie man Strings mit sed
findet und ersetzt. Wir zeigen Ihnen auch, wie Sie eine rekursive Suche durchführen und ersetzen.
Suchen und Ersetzen Sie die Zeichenfolge durch sed #
Es gibt mehrere Versionen von sed
mit einigen funktionalen Unterschieden zwischen ihnen. macOS verwendet die BSD-Version, während die meisten Linux-Distributionen standardmäßig mit GNU sed
vorinstalliert sind. Wir werden die GNU-Version verwenden.,
Die allgemeine Form des Suchens und Ersetzens von Text mit sed
hat die folgende Form:
sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
-
-i
– Standardmäßig schreibtsed
seine Ausgabe in die Standardausgabe. Diese Option weistsed
an, die vorhandenen Dateien zu bearbeiten. Wenn eine Erweiterung angegeben wird (ex-i. bak), wird eine Sicherung der Originaldatei erstellt. -
s
– Der Ersatzbefehl, wahrscheinlich der am häufigsten verwendete Befehl in sed. -
/ / /
– Trennzeichen., Es kann ein beliebiges Zeichen sein, aber normalerweise wird der Schrägstrich (/
) verwendet. -
SEARCH_REGEX
– Normale Zeichenfolge oder ein regulärer Ausdruck zu suchen. -
REPLACEMENT
– Die Ersatz-Zeichenfolge. -
g
– Global-Ersatz-Flagge. Standardmäßig liestsed
die Datei Zeile für Zeile und ändert nur das erste Vorkommen derSEARCH_REGEX
in einer Zeile. Wenn das Ersatzflag bereitgestellt wird, werden alle Vorkommen ersetzt., -
INPUTFILE
– Der Name der Datei, auf der Sie den Befehl ausführen möchten.
Es empfiehlt sich, Anführungszeichen um das Argument zu setzen, damit die Shell-Metazeichen nicht erweitert werden.
Lassen Sie uns sehen, wie wir mit dem Befehl sed
Text in Dateien mit einigen der am häufigsten verwendeten Optionen und Flags suchen und ersetzen können.
Zu Demonstrationszwecken verwenden wir die folgende Datei:
123 Foo foo foo foo /bin/bash Ubuntu foobar 456
Wenn das g
Flag weggelassen wird, wird nur die erste Instanz der Suchzeichenfolge in jeder Zeile ersetzt:
sed -i 's/foo/linux/' file.txt
123 Foo linux foo linux /bin/bash Ubuntu foobar 456
Mit dem globalen Ersatzflag sed
ersetzt alle Vorkommen des Suchmusters:
sed -i 's/foo/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu linuxbar 456
Wie Sie vielleicht bemerkt haben, wird die Teilzeichenfolge foo
innerhalb der Zeichenfolge auch im vorherigen Beispiel ersetzt., Wenn dies nicht das gewünschte Verhalten ist, verwenden Sie den Wortgrenzausdruck (\b
) an beiden Enden der Suchzeichenfolge. Dadurch wird sichergestellt, dass die Teilwörter nicht übereinstimmen.
sed -i 's/\bfoo\b/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu foobar 456
Um die Groß-und Kleinschreibung des Musters unempfindlich zu machen, verwenden Sie das Flag I
., Im folgenden Beispiel verwenden wir sowohl die g
als auch die I
Flags:
sed -i 's/foo/linux/gI' file.txt
123 linux linux linux linux /bin/bash Ubuntu linuxbar 456
Wenn Sie eine Zeichenfolge suchen und ersetzen möchten, die das Trennzeichen enthält (/
), benötigen Sie verwenden Sie den Backslash (\
), um dem Schrägstrich zu entkommen. Um beispielsweise /bin/bash
durch /usr/bin/zsh
zu ersetzen, würden Sie
sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt
Die einfachere und lesbarere Option ist die Verwendung eines anderen Trennzeichens., Die meisten Leute verwenden den vertikalen Balken (|
) oder 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. Um beispielsweise alle 3-stelligen Zahlen zu durchsuchen und durch die Zeichenfolge number
zu ersetzen, verwenden Sie:
sed -i 's/\b\{3\}\b/number/g' file.txt
number Foo foo foo foo /bin/bash demo foobar number
Ein weiteres nützliches Merkmal von sed ist, dass Sie das kaufmännische Zeichen &
verwenden können, das dem übereinstimmenden Muster entspricht., Das Zeichen kann mehrmals verwendet werden.
Wenn Sie beispielsweise geschweifte Klammern {}
um jede 3-stellige Zahl hinzufü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 Sicherungsdatei für die Option -i
an., Um beispielsweise die file.txt
zu bearbeiten und die Originaldatei als file.txt.bak
zu speichern, verwenden Sie:
sed -i.bak 's/foo/linux/g' file.txt
Um sicherzustellen, dass die Sicherung erstellt wird, listen Sie die Dateien mit dem Befehl ls
auf:
ls
file.txt file.txt.bak
Rekursiv Suchen und Ersetzen #
Manchmal möchten Sie möglicherweise rekursiv nach Dateien suchen, die eine Zeichenfolge enthalten, und die Zeichenfolge in allen Dateien ersetzen., Dies kann mit Befehlen wie find
oder grep
erfolgen, um rekursiv Dateien im Verzeichnis zu finden und die Dateinamen an sed
weiterzuleiten.
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, die Leerzeichen in ihren Namen enthalten, verwenden Sie die Option -print0
, die find
mitteilt, um den Dateinamen zu drucken, gefolgt von einem Nullzeichen und leiten Sie die Ausgabe an sed
mit xargs -0
:
find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
Um ein Verzeichnis auszuschließen, verwenden Sie die Option -not -path
.,arting mit Punkt (.
), verwenden Sie:
find . -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'
Wenn Sie Text nur in Dateien mit einer bestimmten Erweiterung suchen und ersetzen möchten, verwenden Sie:
find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'
Eine weitere Option besteht darin, den Befehl grep
zu verwenden, um alle dateien, die das Suchmuster enthalten, und leiten dann die Dateinamen an sed
:
grep -rlZ 'foo' . | xargs -0 sed -i.bak 's/foo/bar/g'
: #
Obwohl es kompliziert und komplex erscheinen mag, ist das Suchen und Ersetzen von Text in Dateien zunächst sehr einfach mit sed
.,
Um mehr über sed
Befehle, Optionen und Flags zu erfahren, besuchen Sie das GNU sed manual und das Grymoire sed Tutorial .
Leave a Reply