web-dev-qa-db-ja.com

検索とsed(検索と置換)

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 .
34
Amir Afghani

まず、シェルスクリプトで"'(それぞれ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.txtfile1.txt.bakとしてバックアップしてから、元のファイルで置換を実行します。空の引数''を使用することは、バックアップファイルを使用しないことを意味します。

GNU(またはNetBSD、OpenBSD、busybox)実装での同じことは、次のようになります。

find . -name "*.Java" -exec sed -i s/foo/bar/g {} +

@ bahamat@ Mikel@ pieter-breed 、コメントで私の回答を改善してくれてありがとう。

40
janos