.png)
私は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"
必要であることに注意してください。foo
bar
sed
FreeBSD のフラグ実装では、-i
引数としてバックアップ ファイルの拡張子が必要です。たとえば、-i .bak
コマンドを使用すると、元のファイルで置換を実行する前に、まずバックアップが行われます。空の引数を使用すると、file1.txt
バックアップファイルを使用しないことになり、これが必要な動作のようです。file1.txt.bak
''
GNU (または NetBSD、OpenBSD、busybox) 実装では同じことが次のようになります。
find . -name "*.java" -exec sed -i "s/foo/bar/g" {} +