grep で一致したすべてのファイルの文字列を検索して置換するということですか?
perl -p -i -e 's/oldstring/newstring/g' `grep -ril searchpattern *`
編集
これはかなり人気のある質問のように思われるので、更新したいと思います.
最近は主に ack-grep
を使用しています より使いやすいからです。したがって、上記のコマンドは次のようになります:
perl -p -i -e 's/old/new/g' `ack -l searchpattern`
ファイル名の空白を処理するには、次を実行できます:
ack --print0 -l searchpattern | xargs -0 perl -p -i -e 's/old/new/g'
ack-grep
でさらに多くのことができます .検索を HTML ファイルのみに制限したいとします:
ack --print0 --html -l searchpattern | xargs -0 perl -p -i -e 's/old/new/g'
空白が問題にならない場合は、さらに短くなります:
perl -p -i -e 's/old/new/g' `ack -l --html searchpattern`
perl -p -i -e 's/old/new/g' `ack -f --html` # will match all html files
あなたが与えた例に基づいて、これはあなたが望むもののようです:
sed -i 's/foo/bar/g' *
再帰的ではありません (サブディレクトリに降りることはありません)。ツリー全体で選択したファイルを置き換える良い解決策として、find:
を使用します。find . -name '*.html' -print -exec sed -i.bak 's/foo/bar/g' {} \;
*.html
ファイルが一致しなければならない式、.bak
-i
の後 元のファイルのコピーを作成し、.bak 拡張子 (任意の拡張子を指定できます) と g
を付けます。 sed 式の最後にある sed は、(最初の 1 つだけではなく) 1 行で複数のコピーを置き換えるように指示します。 -print
検索は、一致したファイルを表示するのに便利です。これはすべて、システム上のこれらのツールの正確なバージョンによって異なります。