2014-01-20 11 views
15

私のプロジェクトでbisonパーサを使用しています。私は、次のコマンドを実行すると:-iコマンドは、Linuxマシンでは正常に動作しますSTDINsed:Mac OS Xでstdinと-iを使用できない

では使用できない場合があります

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

を私は はSEDこのエラーが発生します。私はMac OS X 10.9を使用しています。それはMac OS Xでのみエラーを投げます。なぜ私は分からない。誰も助けることができますか?

ありがとうございました

+0

"-e"フラグを削除して、行末に "y.tab.c"を入れてみます。このように 'sed -i" s /.../ "y.tab.c – Trenin

答えて

8

最後のパラメータとして入力ファイルを配置する必要があります。

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

ありがとう。出来た! :) – sarghau

18

問題は、Mac OS Xが若干異なる-iオプションを扱うsedのBSD版を、使用していることです。 Linuxで使用されるGNUバージョンは、オプションの引数をとって-iとなります。存在する場合、sedは、名前が入力ファイルと引数で構成されるバックアップファイルを作成します。引数がなければ、sedは元のファイルのバックアップを保存せずに入力ファイルを変更するだけです。

BSD sedでは、引数を-iにする必要があります。バックアップを避けるには、長さ0の引数を指定する必要があります。 sed -i '' y.tab.c ...

あなたのコマンドは、y.tab.cをLinuxでバックアップせずに編集するだけで、拡張子として 'y.tab.c'を使用してバックアップファイルを保存しようとします。しかし、現在、コマンドラインに他のファイルがないので、sedは標準入力をその場で編集したいと考えていますが、これは許可されていません。

+0

情報ありがとう! – sarghau

+1

'sed -i 'file'はOSX上で動作しますが、移植性がありません。少なくともCygwinやおそらくLinuxでは失敗します。 'sed -i'.bak 'file'はもっとも移植性の高い構文ですが、最後に' rm file.bak'を実行する必要があります。 –

+0

POSIX標準では '-i'オプションが指定されていないため、どちらの形式も移植性がありません。真の移植性のためには、自分自身で一時ファイルを扱う必要があります: 'sed '...' file> file.new; mv file file.bak; mv file.new file'と入力します。 – chepner

2

間に合わせと-ソリューションのための@ chepnerの説明のオフピギーバッキング:

が、その後、そのジョブがbrew install gnu-sedを成し遂げるだろうSEDのバージョンをインストールスクリプトにsedの用法を置き換えますgsedとなります。

(自作コミュニティはOS Xの内蔵インの発生する可能性がある問題のかなり認識しているが予期せず上書きされており、ほとんどの代替ディストリビューションコマンドのことをしないに取り組んできました。)

3

SEDからmanページ:

-i拡張子を指定した拡張子を持つバックアップを保存し、インプレース 編集ファイル、。 長さゼロの拡張子が指定されている場合、バックアップは保存されません。インプレース 編集ファイル、あなたがなど、ディスク領域が使い果たされるsitu- ationsの破損または部分コンテンツを、リスクとして

ソリューションにあるときに は長さゼロの延長を与えることをお勧めしません

関連する問題