it-swarm.com.de

sed: -i kann nicht mit stdin unter Mac OS X verwendet werden

Ich verwende in meinem Projekt einen Bisonparser. Wenn ich den folgenden Befehl ausführen:

sed -i y.tab.c -e "s/  __attribute__ ((__unused__))$/# ifndef __cplusplus\n  __attribute__ ((__unused__));\n# endif/"

Ich erhalte diese Fehlermeldung Sed: -i kann nicht mit stdin verwendet werden

Der Befehl funktioniert gut auf Linux-Maschinen. Ich verwende Mac OS X 10.9. Es wird nur auf Mac OS X ein Fehler ausgegeben. Ich weiß nicht warum. Kann jemand helfen? 

Vielen Dank

20
sarghau

Sie müssen die Eingabedatei als letzten Parameter angeben.

sed -i -e "s/  __attribute__ ((__unused__))$/# ifndef __cplusplus\n  __attribute__ ((__unused__));\n# endif/" y.tab.c
11
Trenin

Das Problem ist, dass Mac OS X die BSD-Version von sed verwendet, die die -i-Option etwas anders behandelt. Die in Linux verwendete Version GNU benötigt ein optionales Argument mit -i: Falls vorhanden, erstellt sed eine Sicherungsdatei, deren Name aus der Eingabedatei und dem Argument besteht. Ohne ein Argument ändert sed einfach die Eingabedatei, ohne eine Sicherung des Originals zu speichern.

In BSD sed ist das Argument zu -i erforderlich. Um das Erstellen einer Sicherung zu vermeiden, müssen Sie ein Argument mit der Länge Null angeben, z. sed -i '' y.tab.c ....

Ihr Befehl, der einfach y.tab.c ohne Sicherung in Linux bearbeitet, versucht, eine Sicherungsdatei mit 'y.tab.c' als Erweiterung zu speichern. Jetzt, da sich keine andere Datei in der Befehlszeile befindet, möchte sed, dass Sie die Standardeingabe direkt bearbeiten möchten. Dies ist nicht zulässig.

24
chepner

Aus der sed-Manpage:

-i Erweiterung Dateien direkt bearbeiten, Backups mit der angegebenen Erweiterung speichern. Wenn eine Erweiterung mit der Länge Null angegeben wird, wird kein Backup gespeichert. Es wird Nicht empfohlen, eine Erweiterung der Länge Null anzugeben, wenn Dateien In situ bearbeitet werden, da Sie in diesem Fall die Gefahr von Korruption oder Teilinhalten riskieren. usw.

Die Lösung ist das Senden einer Erweiterung mit der Länge Null wie folgt:

sed -i '' 's/apples/oranges/' file.txt
8
KunMing Xie

Huckepack auf @ chepners Erklärung für eine schnelle und schmutzige Lösung:

Installieren Sie die Version von sed, die den Job mit brew install gnu-sed erledigt hat, und ersetzen Sie dann die Verwendung von sed in Ihrem Skript durch gsed.

(Die Homebrew-Community ist sich der Probleme ziemlich bewusst, die durch OS X-Built-Ins entstehen können, und wird unerwartet überschrieben. Dies hat sich jedoch bei den meisten alternativen Distro-Befehlen bewährt.)

2