2013-10-18 9 views
102

現在のクライアントに対して強制的にCVSを使用しており、リモートrepoのアドレスが変更されています。ローカルコードでリモートアドレスを変更するための唯一の方法は、再帰的な検索と置き換えです。しかし無効なコマンドコード。期間をエスケープしてもsedを使用

、私は仕事を期待したいsedコマンドで:

find ./ -type f -exec sed -i "s/192.168.20.1/new.domain.com/" {} \;

私はすべてのファイルのエラーを取得:

sed: 1: ".//file/path ...": invalid command code .

私は脱出しようとしましたsedの一致/置換の期間は何も解決しません。

答えて

249

を避けるために、単一引用符ではなく二重引用符でs///を囲んで良いでしょうsedコマンドとは関係ありません。 sedのOSXバージョンでは、-iオプションはextension引数を想定しているため、コマンドは実際にはextension引数として解析され、ファイルパスはコマンドコードとして解釈されます。

てみ明示的-e引数を追加して-iに引数として''を与える:

find ./ -type f -exec sed -i '' -e "s/192.168.20.1/new.domain.com/" {} \; 

thisを参照してください。

+1

しかし、あなたが与えるコマンド例は次のようになります:sed:REエラー:不正なバイトシーケンス – helion3

+0

私のテストで問題なく動作するので、おそらくコピー貼り付けエンコーディングの問題です。参照してください[これ](http://stackoverflow.com/questions/11287564/getting-sed-error-illegal-byte-sequence-in-bash) – damienfrancois

+14

私は違いを見つけたように10分を費やした場合、それは-eですオプション – acheron55

0

おそらく、新しいドメインには/が含まれていますか?その場合は、に/以外の区切り文字を使用してください。 #,など

find ./ -type f -exec sed -i 's#192.168.20.1#new.domain.com#' {} \; 

また、このおそらく、あなたはOS X上であれば変数置換またはその他の予期しない動作

26

-iに引数を指定してください。 -iから-i ''に変更してください。

もちろん、ファイルをバックアップしたくないということです。そうでない場合は、-i .bakのような選択肢を提供してください。

関連する問題