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 . 

コメント

  • それはまさにあなたが'実行中ですか?-execとその後のすべてを削除するとどうなりますか?Javaファイルの名前が出力されますか?(I '心配です' ASCII引用符の代わりにスマート引用符を使用していること。)
  • 実際には、少なくとも私にとってはそれで解決します。二重引用符と一重引用符の両方を置き換える必要があります。それぞれ"'によって。
  • Smアート(?)引用符! .. 🙂
  • 貼り付けたのは、まさに私が実行していたものでした。誰かが回答を投稿できますか?
  • 次回、質問したときに表示されるエラーメッセージを投稿してください。みんなの時間を節約できます。

回答

まず、通常の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.txtfile1.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の構文で必要です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です