Ich möchte eine Datei mit sed unter OS X bearbeiten. Ich verwende den folgenden Befehl:
sed 's/oldword/newword/' file.txt
Die Ausgabe wird an das Terminal gesendet. file.txt wird nicht geändert. Die Änderungen werden mit diesem Befehl in file2.txt gespeichert:
sed 's/oldword/newword/' file1.txt > file2.txt
Ich möchte jedoch keine weitere Datei. Ich möchte nur file1.txt bearbeiten. Wie kann ich das machen?
Ich habe es mit der -i-Flagge versucht. Dies führt zu folgendem Fehler:
sed: 1: "file1.txt": invalid command code f
Du kannst den ... benutzen -i
Markieren Sie es richtig, indem Sie es mit einem Suffix versehen, das der gesicherten Datei hinzugefügt werden soll. Erweitern Sie Ihr Beispiel:
sed -i.bu 's/oldword/newword/' file1.txt
Gibt Ihnen zwei Dateien: eine mit dem Namen file1.txt
mit der Ersetzung und einer mit dem Namen file1.txt.bu
das hat den ursprünglichen Inhalt.
leicht gefährlich
Wenn Sie die Originaldatei zerstörerisch überschreiben möchten, verwenden Sie Folgendes:
sed -i '' 's/oldword/newword/' file1.txt
^ note the space
Aufgrund der Art und Weise, wie die Zeile analysiert wird, ist ein Leerzeichen zwischen dem Optionsflag und seinem Argument erforderlich, da das Argument die Länge Null hat.
Abgesehen davon, dass Ihr Original möglicherweise in den Papierkorb geworfen wird, sind mir keine weiteren Gefahren durch Tricks auf diese Weise bekannt. Es sollte jedoch beachtet werden, dass The Unix Way (IMHO), wenn dieser Aufruf von sed
Teil eines Skripts ist, sed
zerstörungsfrei verwenden soll, um zu testen, ob es ordnungsgemäß beendet wurde und erst dann die fremde Datei entfernen.
Ich habe ein ähnliches Problem mit MacOS
sed -i '' 's/oldword/newword/' file1.txt
funktioniert nicht, aber
sed -i"any_symbol" 's/oldword/newword/' file1.txt
funktioniert gut.
Sie können -i''
(--in-place
) für sed
wie bereits vorgeschlagen. Siehe: Die -i
In-Place-Argument , beachten Sie jedoch, dass -i
Option ist eine nicht standardmäßige FreeBSD-Erweiterung und steht unter anderen Betriebssystemen möglicherweise nicht zur Verfügung. Zweitens ist sed
ein [~ # ~] s [~ # ~] tream [~ # ~] ed [~ # ~] itor, kein Datei-Editor .
Eine alternative Möglichkeit ist die Verwendung der eingebauten Ersetzung im Vim Ex-Modus, z. B .:
$ ex +%s/foo/bar/g -scwq file.txt
und für mehrere Dateien:
$ ex +'bufdo!%s/foo/bar/g' -scxa *.*
Um alle Dateien rekursiv zu bearbeiten, können Sie **/*.*
wenn Shell das unterstützt (aktivieren durch shopt -s globstar
).
Eine andere Möglichkeit ist die Verwendung von gawk
und seiner neuen "inplace" -Erweiterung wie:
$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1
Sie können verwenden:
sed -i -e 's/<string-to-find>/<string-to-replace>/' <your-file-path>
Beispiel:
sed -i -e 's/Hello/Bye/' file.txt
Dies funktioniert einwandfrei in Mac.
sed -i -- "s/https/http/g" file.txt
Dadurch werden Sicherungsdateien erstellt. Z.B. sed -i -e 's/hello/hello world/' testfile
erstellt für mich eine Sicherungsdatei, testfile-e, im selben Verzeichnis.