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?

3voto

Thor Punkte 42021

Sie haben nicht angegeben, welche Shell Sie verwenden, aber mit zsh können Sie die =( ) Konstrukt zu erreichen. Etwas in der Art von:

cp =(sed ... file; sync) file

=( ) ist vergleichbar mit >( ) sondern erstellt eine temporäre Datei, die automatisch gelöscht wird, wenn cp wird beendet.

2voto

JJM Punkte 31
mv file.txt file.tmp && sed 's/foo/bar/g' < file.tmp > file.txt

Sollte alle Hardlinks erhalten, da die Ausgabe zurückgeführt wird, um den Inhalt der Originaldatei zu überschreiben, und vermeidet die Notwendigkeit einer speziellen Version von sed.

2voto

Clark Benham Punkte 59

Um dieses Problem auf dem Mac zu beheben, mußte ich einige Unix-Funktionen zu core-utils wie folgt hinzufügen diese .

brew install grep
==> Caveats
All commands have been installed with the prefix "g".
If you need to use these commands with their normal names, you
can add a "gnubin" directory to your PATH from your bashrc like:
  PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"

Anruf mit gsed anstelle von sed . Der Mac-Standard mag nicht, wie grep -rl zeigt Dateinamen mit dem ./ vorweggenommen.

~/my-dir/configs$ grep -rl Promise . | xargs sed -i 's/Promise/Bluebird/g'

sed: 1: "./test_config.js": invalid command code .

Ich musste auch xargs -I{} sed -i 's/Promise/Bluebird/g' {} für Dateien mit einem Leerzeichen im Namen.

1voto

Robert Punkte 133

Sehr gute Beispiele. Ich stand vor der Herausforderung, viele Dateien an Ort und Stelle zu bearbeiten, und die Option -i scheint die einzige vernünftige Lösung zu sein, wenn man sie innerhalb des Befehls find verwendet. Hier das Skript zum Hinzufügen von "version:" vor der ersten Zeile jeder Datei:

find . -name pkg.json -print -exec sed -i '.bak' '1 s/^/version /' {} \;

1voto

Mark Yuan Punkte 11

Wenn Sie Zeichenfolgen, die '/' enthalten, ersetzen wollen, können Sie '?' verwenden. z.B. ersetzen Sie '/usr/local/bin/python' durch '/usr/bin/python3' für alle *.py-Dateien.

finden. -name \*.py -exec sed -i 's?/usr/local/bin/python?/usr/bin/python3?g' {} \;

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