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引用符を使用する必要があります。詳しく見ると少し違って見えます。これは、Word、OOWriter、ブラウザウィンドウなどのリッチテキスト文書形式のコピー/貼り付けエラーである可能性があります。'0x220x27

Macを使用しているので、FreeBSDの実装がある可能性が高いですsed。この場合、次のコマンドを作成する必要があります。

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

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

または中にスペースがある場合は、周囲に引用符を"s/foo/bar/g"付ける必要があります。foobar

FreeBSDでsedこの-iフラグを実装するには、バックアップファイル拡張子という1つのパラメータが必要です。たとえば、-i .bakこのコマンドを使用すると、最初にバックアップが作成され、元のfile1.txtファイルfile1.txt.bakで置き換えられます。空のパラメータを使用すること''は、バックアップファイルを使用しないことを意味しますが、必要に応じているようです。

GNU(またはNetBSD、OpenBSD、busybox)の実装でも同じ内容は次のとおりです。

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

ありがとうおじさんそして@ミケルそして@ピーター - 品種あなたのコメントで私の答えを改善してください。

関連情報