Macで次のコマンドを使用しています:
$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \;
効果がないようです。
ディレクトリに.javaで終わる2つのファイルがあり、どちらにもfooがあります。何かが足りませんか?
編集:コメントのリクエストの結果
[aafghani-03:~/test amirafghani]$ find . -name "*.java" -exec sed -i "s/foo/bar/g" {} \; sed: 1: "./bar.java": invalid command code . sed: 1: "./foo.java": invalid command code .
コメント
回答
まず、通常のASCIIを使用していることを確認してください"
や"
(ASCIIコード0x22
や)シェルスクリプトでは、投稿の例に非標準の引用符が含まれているためです。よく見ると、少し異なって見えます。おそらく、これはリッチテキストドキュメントからのコピーアンドペーストエラーです。 Word、OOWriter、さらにはブラウザウィンドウなどの形式。
Macを使用しているため、おそらくsed
のFreeBSD実装があります。次のようにコマンドを作成する必要がある場合:
find . -name "*.java" -exec sed -i "" s/foo/bar/g {} +
(ここではiv id =の代わりに+
を使用します”00a3d0c9c2″>
ファイルごとに1つのsed
呼び出しを実行しないようにします。
sed
フラグには引数が必要です:バックアップファイルの拡張子。たとえば、-i .bak
の場合、コマンドは、で置換を実行する前に、まずfile1.txt
をfile1.txt.bak
としてバックアップします。元のファイル。空の引数を使用する""
は、バックアップファイルを使用しないことを意味します。これはあなたが望むようです。
GNU(またはNetBSD、OpenBSD)でも同じです。 、busybox)の実装は次のようになります:
find . -name "*.java" -exec sed -i s/foo/bar/g {} +
ありがとう @bahamat と @Mikel と @ pieter-breed は、コメントで私の答えを改善してくれました。
コメント
- 中括弧は何をしますか?
- @ZaneHitchcox中括弧は一致したファイル名のプレースホルダーです
- what '
+
は最後に実行しますか? - @Anthony
+
は、-exec
オプションの引数のリストを終了します。-exec
の構文で必要です。
-exec
とその後のすべてを削除するとどうなりますか?Javaファイルの名前が出力されますか?(I '心配です' ASCII引用符の代わりにスマート引用符を使用していること。)"
と'
によって。