Interactive search and replace from shell
I would add these modifications to Dillon's answer:
The -le
option should be added to the grep
command.
vim `find . -name '*.c' -exec grep -le '\<junk\>' {} \;`
Then you are in Vim, but you don't have the opportunity to choose what to replace, add c
option at the end for interactive replacements and bufdo
at the beginning for walking through every file:
:bufdo %s/junk/rubbish/gce
Later you save all your work:
:bufdo wq!
From jhvaras answer, I've made this bash command to quickly search and replace (to add to .bashrc
):
replace () { if [ $# -lt 2 ] then echo "Recursive, interactive text replacement" echo "Usage: replace text replacement" return fi vim -u NONE -c ":execute ':argdo %s/$1/$2/gc | update' | :q" $(ag $1 -l)}
It's used as follows:
~$ replace some_text some_new_text
It uses ag
to search in advance, as it's probably faster than letting vim
do the work, but you can probably substitute anything else you like. It also calls vim
with no plugins for maximum speed, and after it has finished all substitutions it automatically quits and goes back to the shell.