コマンドコードが無効です。ピリオドがエスケープされていますが、sedを使用しています


187

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

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

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

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

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

私はsedの一致/置換のピリオドを回避しようとしましたが、それは何も解決しません。

回答:


475

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/" {} \;

参照してくださいこれを


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

9
この質問RE error: illegal byte sequenceはMacOSでの回答です。
JonasVautherin 2014

11
-iのパラメーターとして空の文字列 ''を使用し、それは次のように機能しましたsed -i '' 's/blah/xx/g'
Pierre Houston

25
私にとっては、追加-e後に-i作られたsed、このようにバックアップすべての私のファイルを:「foo.txtの」 - >「foo.txtの-e」を。明らかに私が欲しかったのはむしろ-i ''、つまり、変更されたファイルをバックアップしないことでした。
mdup 2014年

3
私にとっても同じ問題です。これ-i -eと組み合わせて、find多くの多くのファイルがで終わる結果となりました-e-e-e-e-e-e-e
aspyct 2014

39

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

もちろん、これはファイルをバックアップしたくないことを意味します。それ以外の場合は、のように選択した拡張子を指定します-i .bak


4

OS Xでは、貧弱な組み込みsedが適切になるのに役立ちます。解決策は次のとおりです。

brew install gnu-sed

そして、sedの代わりにgsedを使用します。これは期待どおりに機能します。


1
この回答はありがとうございました。LinuxとMacの両方で作業しているので、2つの密接に関連するツール間の難解な違いを学ぶよりも、使い慣れたツールにアクセスする方がはるかに好きです。
スティーブンシャンク

3

おそらくあなたの新しいドメインは含まれてい/ますか?もしそうなら、以外のセパレータを使用してみてください/ではsed、例えば#,など

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.