web-dev-qa-db-ja.com

grepで返されたすべてのファイルを一括編集できますか?

Grepで返される大量のファイルを一括編集したい。 (私は知っている、私はsedで良くなるはずです)。

だから私がするなら:

grep -rnI 'xg_icon-*'

それらすべてのファイルをviにパイプするにはどうすればよいですか?

53
mager

最も簡単な方法は、grepにファイル名(-l の代わりに -n)パターンに一致します。それをサブシェルで実行し、結果をVimにフィードします。

vim $(grep -rIl 'xg_icon-*' *)
77
jamessan

これに対する素晴らしい一般的な解決策は、xargsを使用して、stdoutをgrepなどのプロセスから引数リストに変換することです。

アラ:

grep -rIl 'xg_icon-*' | xargs vi
21
Benj

vimと-pオプションを使用すると、各ファイルがタブで開かれ、gtまたはgT、またはターミナルでマウスがサポートされている場合はマウスを使用してファイルを切り替えることができます。

7
user210574

Grep出力を処理せずにそれを行うことができます!これにより、正しい行に移動することもできます(:help quickfixコマンド、たとえば:cnまたは:cwを使用)。したがって、bashまたはzshを使用している場合:

 vim -q <(grep foo * .c)
7
Jaen

編集する内容がすべてのファイルで類似している場合は、viを使用して手動で編集しても意味がありません。 (viをスクリプト化することもできますが)仮に、編集する内容については決して言及しないので、仮想的には次のようになります。

grep -rnI 'xg_icon-*' | while read FILE
do
    sed -i.bak 's/old/new/g' $FILE # (or other editing commands, eg awk... )
done
1
ghostdog74
vi `grep -l -i findthisword *`
1
Mookayama