505 Stimmen

sed Datei an Ort und Stelle bearbeiten

Ich versuche herauszufinden, ob es möglich ist, eine Datei mit einem einzigen sed-Befehl zu bearbeiten, ohne manuell Streaming des bearbeiteten Inhalts in eine neue Datei und anschließende Umbenennung der neuen Datei in den ursprünglichen Dateinamen.

Ich habe die -i Option, aber mein Solaris-System sagte, dass -i ist eine illegale Option. Gibt es einen anderen Weg?

821voto

choroba Punkte 214897

Les -i opción streamt den bearbeiteten Inhalt in eine neue Datei und benennt sie dann im Hintergrund um.

Ejemplo:

sed -i 's/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g' filename

unter macOS benötigen Sie:

sed -i '' 's/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g' filename

88voto

Steve Punkte 45842

In einem System, in dem sed nicht die Möglichkeit hat, Dateien an Ort und Stelle zu bearbeiten, denke ich, dass die bessere Lösung die Verwendung von perl :

perl -pi -e 's/foo/bar/g' file.txt

Dabei wird zwar eine temporäre Datei erstellt, diese ersetzt jedoch die ursprüngliche Datei, da ein leeres Suffix bzw. eine leere Dateierweiterung angegeben wurde.

82voto

diadyne Punkte 3878

Beachten Sie, dass Sie unter OS X seltsame Fehlermeldungen wie "ungültiger Befehlscode" oder andere seltsame Fehler erhalten können, wenn Sie diesen Befehl ausführen. Um dieses Problem zu beheben, versuchen Sie

sed -i '' -e "s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g" <file>

Das liegt daran, dass bei der OSX-Version von sed die -i Option erwartet eine extension Argument, damit Ihr Befehl tatsächlich als extension Argument und der Dateipfad wird als Befehlscode interpretiert. Quelle: https://stackoverflow.com/a/19457213

34voto

minhas23 Punkte 8655

Folgendes funktioniert auf meinem Mac problemlos

sed -i.bak 's/foo/bar/g' sample

In der Beispieldatei wird foo durch bar ersetzt. Die Sicherung der Originaldatei wird in sample.bak gespeichert.

Für die Inline-Bearbeitung ohne Backup verwenden Sie den folgenden Befehl

sed -i'' 's/foo/bar/g' sample

20voto

Dwight Spencer Punkte 1367

Eine Sache ist zu beachten, sed kann selbst keine Dateien schreiben, da der einzige Zweck von sed darin besteht, als Editor für den "Stream" zu fungieren (d.h. Pipelines von stdin, stdout, stderr und anderen >&n Puffer, Steckdosen und dergleichen). In diesem Sinne können Sie einen anderen Befehl verwenden tee um die Ausgabe zurück in die Datei zu schreiben. Eine andere Möglichkeit besteht darin, einen Patch zu erstellen, indem man den Inhalt in diff .

Tee-Methode

sed '/regex/' <file> | tee <file>

Patch-Methode

sed '/regex/' <file> | diff -p <file> /dev/stdin | patch

UPDATE:

Beachten Sie auch, dass der Patch die Datei ab Zeile 1 der diff-Ausgabe ändern wird:

Patch braucht nicht zu wissen, auf welche Datei er zugreifen soll, da dies in der ersten Zeile der Ausgabe von diff steht:

$ echo foobar | tee fubar

$ sed 's/oo/u/' fubar | diff -p fubar /dev/stdin
*** fubar   2014-03-15 18:06:09.000000000 -0500
--- /dev/stdin  2014-03-15 18:06:41.000000000 -0500
***************
*** 1 ****
! foobar
--- 1 ----
! fubar

$ sed 's/oo/u/' fubar | diff -p fubar /dev/stdin | patch
patching file fubar

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X