web-dev-qa-db-ja.com

無効なコマンドコード。、ピリオドのエスケープにもかかわらず、sedを使用

現在のクライアントにCVSの使用を強制され、リモートリポジトリのアドレスが変更された。ローカルコードでリモートアドレスを変更する唯一の方法は、再帰的な検索と置換です。

ただし、sedコマンドを使用すると、動作するはずです。

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

すべてのファイルでエラーが発生します。

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

私はsedマッチ/交換でピリオドをエスケープしようとしましたが、それは何も解決しません。

149
helion3

OS Xを使用している場合、これはおそらくsedコマンドとは関係ありません。 OSXバージョンのsedでは、-iオプションはextension引数を必要とするため、コマンドは実際にextension引数として解析され、ファイルパスはコマンドコードとして解釈されます。

-e引数を明示的に追加し、''の引数として-iを指定してみてください。

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

this を参照してください。

365
damienfrancois

-iに引数を指定するのを忘れただけです。 -i-i ''に変更するだけです。

もちろん、ファイルをバックアップしたくないということです。それ以外の場合は、-i .bakなどの拡張機能を指定します。

33
mdup

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

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

変数の置換やその他の予期しない動作を避けるために、二重引用符ではなく単一引用符でs///を囲むことも良いでしょう

0
jkshah