私の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、ブラウザウィンドウなどのリッチテキスト文書形式のコピー/貼り付けエラーである可能性があります。'
0x22
0x27
Macを使用しているので、FreeBSDの実装がある可能性が高いですsed
。この場合、次のコマンドを作成する必要があります。
find . -name "*.java" -exec sed -i '' "s/foo/bar/g" {} +
(ここでは、ファイルごとに1つの呼び出しを実行するのを避ける+
ために代わりに使用されます)。\;
sed
または中にスペースがある場合は、周囲に引用符を"s/foo/bar/g"
付ける必要があります。foo
bar
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" {} +
ありがとうおじさんそして@ミケルそして@ピーター - 品種あなたのコメントで私の答えを改善してください。