web-dev-qa-db-de.com

In-Place-Änderungen mit sed unter OS X

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
125
SundayMonday

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.

243
whittle

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.

17
ksnt

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
4
kenorb

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.

4
Vincent Lal
sed -i -- "s/https/http/g" file.txt
3
jazzed

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.

1
JustADude