Linux / Befehl sed: Textströme suchen und ersetzen

sed ist ein Stream-Editor, der Eingaben zeilenweise liest, Bearbeitungsregeln anwendet und die Ergebnisse ausgibt. Er eignet sich für wiederholte Texttransformationen, wie z.B. Ersetzungen, das Auswählen bestimmter Zeilen und das Löschen.

Standardmäßig verändert er die Originaldatei nicht und gibt das transformierte Ergebnis an die Standardausgabe aus. Die Form des Ersetzungsbefehls ist s/pattern_to_find/replacement_content/flags, und das Hinzufügen von g ersetzt alle Treffer in einer Zeile.

Grundlegende Syntax

sed [options] 'editing command' [file...]

Installierte Implementierungen und Optionen können je nach Distribution variieren. Überprüfen Sie die Beschreibung für Ihr aktuelles System mit man sed.

Vergleichen Sie die ursprüngliche Eingabe, Ausgabe, Backups und Wiederherstellung

Führen Sie den gesamten Block aus: Er bereitet jede Eingabe in einem neuen temporären Verzeichnis innerhalb eines Subshells vor und gibt dieses Verzeichnis am Ende aus. Er überschreibt keine Dateien im aktuellen Arbeitsverzeichnis. Prüfen Sie die Ergebnisse und entfernen Sie die Labordaten nur, wenn sie nicht mehr benötigt werden.

(
set -eu
labdir=$(mktemp -d)
cd "$labdir"
printf 'red car\nred red\n' > config.txt
sed 's/red/green/' config.txt > first.txt
sed 's/red/green/g' config.txt > all.txt
cat config.txt first.txt all.txt
cp config.txt editable.txt
sed -i.bak 's/red/green/g' editable.txt
diff -u editable.txt.bak editable.txt || test "$?" -eq 1
cmp config.txt editable.txt.bak
cp editable.txt.bak editable.txt
cmp config.txt editable.txt
printf 'Lab files: %s\n' "$labdir"
)

Die Originaldatei enthält weiterhin red car und red red. Beim Ersetzen des ersten Treffers entstehen green car und green red; beim globalen Ersetzen entstehen green car und green green. GNU sed -i.bak ändert editable.txt und behält dessen vorherigen Inhalt in .bak. diff Status 1 bedeutet, dass Unterschiede gefunden wurden, während erfolgreiche cmp-Prüfungen zeigen, dass das Backup und der wiederhergestellte Inhalt mit dem Original übereinstimmen. Überprüfen Sie die -i-Syntax anderer Implementierungen und unterscheiden Sie zwischen regulären Ausdrücken wie .* und Literalzeichenketten.

Hauptoptionen und Format

Optionen/Format Beschreibung
-n Schalten Sie die automatische Ausgabe standardmäßig aus.
-e script Geben Sie mehrere Bearbeitungsbefehle an.
-E Verwenden Sie erweiterte reguläre Ausdrücke.
-i[suffix] Bearbeiten Sie Dateien an Ort und Stelle und erstellen Sie optional eine Sicherung in der GNU-Implementierung.

Vorsichtsmaßnahmen bei der Verwendung

`sed -i verändert tatsächlich die Datei, daher sollten Sie bei wichtigen Dateien einen Sicherungssuffix verwenden und die Ergebnisse überprüfen. Die -i`-Syntax unterscheidet sich zwischen GNU und BSD. Außerdem müssen Sie die Shell-Quotierung und Sonderzeichen in regulären Ausdrücken berücksichtigen.

Häufig gestellte Fragen

Verändert das reine Ausführen von sed die Originaldatei?

Nein. Standardmäßig gibt es das geänderte Ergebnis aus. Sie müssen `-i` verwenden oder das Ergebnis in einer separaten Datei speichern, um die Datei zu ändern.

Offizielle Dokumentation

Die genaue Funktionsweise der Optionen und die Unterschiede zwischen den Implementierungen können Sie in der offiziellen sed-Dokumentation nachlesen.