検索とsed(検索と置換)


26

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 .

2
それはまさにあなたが実行しているものですか?-execそれ以降をすべて削除するとどうなりますか?Javaファイルの名前を印刷しますか?(ASCII引用符の代わりにスマート引用符を使用しているのではないかと心配しています。)
Mikel

1
実際、それは少なくとも私にとっては解決します。二重引用符と単一引用符の両方"'、それぞれとで置き換える必要があります。
レフ

2
スマート(?)引用符!.. :)
Peter.O

貼り付けたのは、まさに私が実行していたものです。誰かが回答を投稿できますか?
アミールアフガニ

1
次回質問をするときに表示されるエラーメッセージを投稿してください。みんなの時間を節約できます。
ミケル

回答:


34

まず、投稿の例に非標準の引用文字が含まれているため、シェルスクリプトで"and '(asciiコード0x22とのような)のような通常のアスキー引用符を使用していることを確認0x27してください。よく見ると、少し違って見えます。ほとんどの場合、これは、Word、OOWriter、またはブラウザーウィンドウなどのリッチテキストドキュメント形式からのコピーアンドペーストエラーです。

Macを使用しているので、おそらくFreeBSDのを実装sedしていることになります。その場合、次のようにコマンドを記述する必要があります。

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

(ここ+では\;sedファイルごとに1 つの呼び出しを実行しないようにする代わりに使用しています)。

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-品種@あなたのコメントで私の答えを向上させるため。


中括弧は何をしますか?
ゼーンヒッチコックス

3
@ZaneHitchcox中括弧は、一致するファイル名のプレースホルダーです
モニカへの進行中の害を
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.