find & sed (検索と置換)

find & 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 .

答え1

まず、シェル スクリプトで"'(それぞれ および の ASCII コード)0x22などの通常の ASCII 引用符を使用していることを確認してください0x27。投稿内の例には非標準の引用符文字が含まれているためです。よく見ると、少し異なって見えます。これは、Word、OOWriter、またはブラウザー ウィンドウなどのリッチ テキスト ドキュメント形式からのコピー アンド ペースト エラーである可能性が最も高いです。

Mac をお使いの場合は、おそらく の FreeBSD 実装がインストールされていますsed。その場合は、コマンドを次のように記述する必要があります。

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

(ここでは、ファイルごとに1 回の呼び出しを実行することを避けるために+、 の代わりにを使用します)。\;sed

またはスペースがある場合は、引用符が"s/foo/bar/g"必要であることに注意してください。foobar

sedFreeBSD のフラグ実装では、-i引数としてバックアップ ファイルの拡張子が必要です。たとえば、-i .bakコマンドを使用すると、元のファイルで置換を実行する前に、まずバックアップが行われます。空の引数を使用すると、file1.txtバックアップファイルを使用しないことになり、これが必要な動作のようです。file1.txt.bak''

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

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

ありがとうバハマトそしてミケルそしてピエターブリードあなたのコメントによって私の回答を改善してくれてありがとう。

関連情報