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コード0x22
および0x27
)などの通常のASCII引用符を使用していることを確認します。投稿に非標準の引用文字が含まれています。よく見ると少し違って見えます。ほとんどの場合、これはWord、OOWriter、またはブラウザウィンドウなどのリッチテキストドキュメント形式のコピーアンドペーストエラーです。
Macを使用しているため、おそらくsed
のFreeBSD実装を使用しています。その場合、コマンドを次のように記述する必要があります。
find . -name "*.Java" -exec sed -i '' s/foo/bar/g {} +
(ここでは、+
の代わりに\;
を使用して、ファイルごとに1つのsed
呼び出しを実行しないようにします)。
FreeBSDのsed
の実装では、-i
フラグに引数、つまりバックアップファイルの拡張子が必要です。たとえば、-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 、コメントで私の回答を改善してくれてありがとう。