find
を使用できます と -exec
sed
に直接 最初に oldstr
を見つけるのではなく grep
で .少し効率が悪いかもしれませんが、それは重要ではないかもしれません。このように、sed
置換は find
でリストされたすべてのファイルに対して実行されます 、しかし oldstr
の場合 そこにはありませんか?
find /path -type f -exec sed -i 's/oldstr/newstr/g' {} \;
あなたの解決策は大丈夫です。この方法でのみ試してください:
files=$(grep -rl oldstr path) && echo $files | xargs sed....
xargs
を実行します grep が 0
を返す場合のみ 、例えばいくつかのファイルで文字列が見つかったとき。
私は Vlad の考えを取り入れ、それを少し変更しました。
の代わりにgrep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' /dev/null
sed: couldn't edit /dev/null: not a regular file
リモートサーバーへの3つの異なる接続でやっています
touch deleteme
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' ./deleteme
rm deleteme
これはあまり洗練されておらず、サーバーへの接続が 2 つ必要になります (1 行ですべてを行う方法があるかもしれません) が、ジョブも効率的に実行されます