mager
mager

Reputation: 4873

Can you mass edit all files returned in a grep?

I want to mass-edit a ton of files that are returned in a grep. (I know, I should get better at sed).

So if I do:

grep -rnI 'xg_icon-*'

How do I pipe all of those files into vi?

Upvotes: 64

Views: 21601

Answers (6)

Mookayama
Mookayama

Reputation: 1343

vi `grep -l -i findthisword *`

Upvotes: 1

Jaen
Jaen

Reputation: 499

You can do it without any processing of the grep output! This will even enable you to go the the right line (using :help quickfix commands, eg. :cn or :cw). So, if you are using bash or zsh:

vim -q <(grep foo *.c)

Upvotes: 10

user210574
user210574

Reputation:

if you use vim and the -p option, it will open each file in a tab, and you can switch between them using gt or gT, or even the mouse if you have mouse support in the terminal

Upvotes: 8

Benj
Benj

Reputation: 32428

A nice general solution to this is to use xargs to convert a stdout from a process like grep to an argument list.

A la:

grep -rIl 'xg_icon-*' | xargs vi

Upvotes: 27

ghostdog74
ghostdog74

Reputation: 343141

if what you want to edit is similar across all files, then no point using vi to do it manually. (although vi can be scripted as well), hypothetically, it looks something like this, since you never mention what you want to edit

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

Upvotes: 2

jamessan
jamessan

Reputation: 42767

The easiest way is to have grep return just the filenames (-l instead of -n) that match the pattern. Run that in a subshell and feed the results to Vim.

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

Upvotes: 93

Related Questions