としてはrandomirさんのコメントで指摘し、彼はにリンク質問、あなたは変数が展開されるように、二重引用符を使用する必要があります。
old="oldtext"
new="newtext"
grep -rZli "$old" | xargs -0 sed -i "s/$old/$new/gi"
は、私もいくつか他のものを変更:
- を環境変数に予約されている名前との衝突を避けるための小文字の変数名
- grep
-Z
ファイル名に改行などの特殊文字を扱うためにNULバイトでファイル名を区切るオプション
- ファイル名がの終わりに行くと、とにかく作業ディレクトリがデフォルト
-0
はNULバイト分離ファイル名
- を期待するxargsのためのオプションは(非推奨)
-i
オプションをスキップとして、sedのパターンの後*
をスキップコマンドはとにかく置換の
i
フラグは、grepコマンド
これらのいくつかは、GNUのgrepの、xargsのを必要とし、sedのでは大文字小文字を区別しないマッチングを一致させます。
あなたが最初にそれらをgrepを正当化するために、ファイルの膨大な数を見ていない場合は、あなただけの一般**/*
グロブを使用して、それらすべての上に単一のsedのプロセスを実行することができます。
shopt -s globstar
sed -i "s/$old/$new/gi" **/*
これは文句を言うでしょうディレクトリについて実行しようとしているsedについてですが、傷つけません。すべてのファイルに.txt
のような共通の拡張子がある場合は、それを避けるために**/*.txt
を使用できます。一方で、あなたはファイルのトンを持っていて、タスクを加速したい、場合
、あなたは並列化するxargsはの-P
オプションを使用することができます:4の並列処理のための
grep -rZli "$old" | xargs -0 -P 4 sed -i "s/$old/$new/gi"
を。
変数は一重引用符では展開されません。二重引用符を使用し、 'oldtext'や' newtext'の代わりに正規表現メタ文字のいくつかを使用しないよう注意してください。 – randomir
ヒント:[shellcheck](http://shellcheck.net)がこれと他の一般的な問題を自動的に検出します –