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 die -i-Flagge ausprobiert. Dies führt zu folgendem Fehler:
sed: 1: "file1.txt": invalid command code f
-i
Flagge ausprobieren ?Antworten:
Sie können das
-i
Flag korrekt verwenden, indem Sie ihm ein Suffix zum Hinzufügen zur gesicherten Datei hinzufügen. Erweitern Sie Ihr Beispiel:Sie erhalten zwei Dateien: eine mit dem Namen
file1.txt
, der die Ersetzung enthält, und eine mit dem Namenfile1.txt.bu
, der den ursprünglichen Inhalt enthält.Leicht gefährlich
Wenn Sie die Originaldatei destruktiv überschreiben möchten, verwenden Sie Folgendes:
Aufgrund der Art und Weise, wie die Zeile analysiert wird, ist zwischen dem Optionsflag und seinem Argument ein Leerzeichen erforderlich, da das Argument die Länge Null hat.
Abgesehen davon, dass Sie möglicherweise Ihr Original wegwerfen, sind mir keine weiteren Gefahren bewusst, wenn Sie auf diese Weise ausgetrickst werden. Es sollte jedoch beachtet werden, dass
sed
The Unix Way ™ (IMHO) , wenn dieser Aufruf von Teil eines Skripts ist,sed
zerstörungsfrei zu verwenden ist, zu testen, ob es sauber beendet wurde, und erst dann die fremde Datei zu entfernen.quelle
-i''
aus einem anderen Grund gefährlich, als die Originaldatei möglicherweise durcheinander zu bringen (und keine Sicherung zu haben)?sed
Manpage könnten Sie eine Datei mitten im Schritt beschädigen und ein schlechtes Ausgabeergebnis erzielen, wenn Ihnen der Speicherplatz auf dem Gerät ausgeht. Wenn Sie unter lokaler Quellcodeverwaltungsed -i ""
ohne Backups arbeiten, sollte dies die meiste Zeit in Ordnung sein (oder kurzgit init && git add -A . && git commit -m 'backup'
bevor Sie sed im-i
Modus ausführen ).-i''
ist gültig, aber-i ''
nicht.Ich habe ein ähnliches Problem mit MacOS
funktioniert nicht, aber
funktioniert gut.
quelle
sed -i '' <file>
funktioniert, funktioniert abersed -i'' <file>
nicht mehrquelle
Sie können
-i''
(--in-place
) fürsed
wie bereits vorgeschlagen verwenden. Siehe: Das-i
In-Place-Argument . Beachten Sie jedoch, dass es sich bei der-i
Option um nicht standardmäßige FreeBSD-Erweiterungen handelt, die unter anderen Betriebssystemen möglicherweise nicht verfügbar sind. Zweitenssed
ist ein S tream ED itor, kein Datei-Editor .Eine alternative Möglichkeit besteht darin, die integrierte Substitution im Vim Ex-Modus zu verwenden, z.
und für mehrere Dateien:
Um alle Dateien rekursiv zu bearbeiten, können Sie verwenden,
**/*.*
wenn die Shell dies unterstützt (aktivieren durchshopt -s globstar
).Eine andere Möglichkeit ist die Verwendung
gawk
und die neue "Inplace" -Erweiterung wie:quelle
Dadurch werden Sicherungsdateien erstellt. ZB erstellt
sed -i -e 's/hello/hello world/' testfile
für mich eine Sicherungsdatei, testfile-e, im selben Verzeichnis.quelle
Sie können verwenden:
Beispiel:
Dies funktioniert einwandfrei in Mac .
quelle
-i
erfordert ein Argument für macOS. Da Sie keine angeben, wird diese verwendet-e
, was dazu führt, dass eine zweite Datei-e
angehängt wird.-e
existiert nicht in macOS, es ist-E
. Der richtige Befehl für macOS lautet alsosed -i '' -E 's/Hello/Bye/' file.txt