Search and replace in Vim across all the project files

vim search and replace all files in a directory
search and replace in all buffers vim
linux find and replace in all files
vim search and replace first occurrence
vim find and replace plugin
vim search file
vim search replace case insensitive
vim replace with match

I'm looking for the best way to do search-and-replace (with confirmation) across all project files in Vim. By "project files" I mean files in the current directory, some of which do not have to be open.

One way to do this could be to simply open all of the files in the current directory:

:args ./**

and then do the search and replace on all open files:

:argdo %s/Search/Replace/gce

However, when I do this, Vim's memory usage jumps from a couple dozen of MB to over 2 GB, which doesn't work for me.

I also have the EasyGrep plugin installed, but it almost never works—either it doesn't find all the occurrences, or it just hangs until I press CtrlC. So far my preferred way to accomplish this task it to ack-grep for the search term, using it's quickfix window open any file that contains the term and was not opened before, and finally :bufdo %s/Search/Replace/gce.

I'm looking either for a good, working plugin that can be used for this, or alternatively a command/sequence of commands that would be easier than the one I'm using now.

Greplace works well for me.

There's also a pathogen ready version on github.

Search and replace in Vim across all the project files, Greplace works well for me. There's also a pathogen ready version on github. TLDR: The grep and cfdo commands let you easily perform search and replace across all files in a project. To replace the string original_string with new_string, run this in command mode.

The other big option here is simply not to use vim:

sed -i 's/pattern/replacement/' <files>

or if you have some way of generating a list of files, perhaps something like this:

find . -name *.cpp | xargs sed -i 's/pattern/replacement/'
grep -rl 'pattern1' | xargs sed -i 's/pattern2/replacement/'

and so on!

Vim: Search and Replace Across All Project Files, TLDR: The grep and cfdo commands let you easily perform search and replace across all files in a project. To replace the string original_string� Search and replace in all files in arglist. In the above substitute command: The search pattern is empty, so the last search is used. Type your replacement text instead of replace. If the text is similar to the current word press Ctrl-R then Ctrl-W to insert that word into the command line, then change it.

EDIT: Use cfdo command instead of cdo to significantly reduce the amount of commands that will be run to accomplish this (because cdo runs commands on each element while cfdo runs commands on each file)

Thanks to the recently added cdo command, you can now do this in two simple commands using whatever grep tool you have installed. No extra plugins required!:

1. :grep <search term>
2. :cdo %s/<search term>/<replace term>/gc
3. (If you want to save the changes in all files) :cdo update

(cdo executes the given command to each term in the quickfix list, which your grep command populates.)

(Remove the c at the end of the 2nd command if you want to replace each search term without confirming each time)

How To Search And Replace String Across Multiple Files in Vim, A useful feature that popular editors like VSCode and Atom has is the ability to search and replace string across many files in a project. The range is optional; if you just run :s/search/replace/, it will search only the current line and match only the first occurrence of a term. Most of the time, that’s not sufficient, so you can add a range like so::8,10 s/search/replace/g . In that example the range is from line 8 to line 10. I’ve also added the “global” option, which tells Vim to replace every occurrence on a line, and not just the first occurrence.

I've decided to use ack and Perl to solve this problem in order to take advantage of the more powerful full Perl regular expressions rather than the GNU subset.

ack -l 'pattern' | xargs perl -pi -E 's/pattern/replacement/g'
Explanation
ack

ack is an awesome command line tool that is a mix of grep, find, and full Perl regular expressions (not just the GNU subset). Its written in pure Perl, its fast, it has syntax highlighting, works on Windows and its friendlier to programmers than the traditional command line tools. Install it on Ubuntu with sudo apt-get install ack-grep.

xargs

Xargs is an old unix command line tool. It reads items from standard input and executes the command specified followed by the items read for standard input. So basically the list of files generated by ack are being appended to the end of the perl -pi -E 's/pattern/replacemnt/g' command.

perl -pi

Perl is a programming language. The -p option causes Perl to create a loop around your program which iterates over filename arguments. The -i option causes Perl to edit the file in place. You can modify this to create backups. The -E option causes Perl to execute the one line of code specified as the program. In our case the program is just a Perl regex substitution. For more information on Perl command line options perldoc perlrun. For more information on Perl see http://www.perl.org/.

Search and replace in multiple buffers | Vim Tips Wiki, Change all occurrences in each line (global). e, No error if the pattern is not found. |, Separator between commands. update� In the video, I find all occurrences of Vimcasts.com and change them to Vimcasts.org. I show two different ways of doing it. This builds on material that was introduced in episodes 41, 42, 43, and 44. Strategy #1 - run :substitute across all project files

Multiple files search and replace in vim, Multiple files search and replace in vim. On 12th March 2017. Many people assume that vim is a dumb editor after they see it for the first time and they start to ask� Next try to find and replace all occurrences of ‘eth1’ with ‘br1’ under vim, enter::%s/eth1/br1/g. Search and replace all occurrences of ‘eth1’ with ‘br1’, but ask for confirmation first on vim, enter::%s/eth1/br1/gc. To find and replace all occurrences of case insensitive ‘eth1’ with ‘br1’, enter::%s/eth1/br1/gi

Vim 101: Search and Replace on Multiple Files - usevim, Vim 101: Search and Replace on Multiple Files Let's say I wanted to rename a variable across lots of files in a project, then all I'd have to do is use a :substitute� Enter your search string and the replace string, then press enter. It may churn for a second searching all files, then it'll show the proposed changes in all your project files -- but note, these changes haven't been made yet! Here's what it looks like: Now you need to make the changes (and even after that, you have to save the modified files.)

Project-wide find and replace, Vim doesn't have a built-in command for project-wide find and replace primitive Ex commands such as :substitute , :argdo , and :vimgrep . Tap ALT, then A, then F. Brings you to File Search. The selection from (2) will auto-fill the search box; In the “File name patterns” input box, type in “.java” for replacing all Java files or type in "" to replace in all files; Click “Replace…” Ctrl+V (Paste). Or type in the value you want to do the replacing ; Enter

Vim Search, Find and Replace: Commands and Plugins, A complete guide about search, find and replace in Vim, in one or multiple file, To know what directory it is for you, execute in Vim the ex command :pwd . search operation needs to be in a whole project or in multiple files,� One of the open questions I have about Vim is if there is a way to perform a search/replace in the current project (bear with me if I use this notion inherited from other editors). For instance, let's assume I want to search my project files for a method name, and rename all the instances of that method call.

Comments
  • @Cascabel Since you wrote this comment, there is a vi.stackexchange.com site.
  • Installed it, I see the other commands like :Gsearch and :Gbuffersearch exist, but when I type :Greplace I get Not an editor command: Greplace.
  • according to the docs, the syntax is: :Gsearch [<grep-option(s)>] [[<pattern>] [<filename(s)>]] so you could do a recursive search using, for example: :Gsearch -r pattern dir/
  • The thing I hate about Greplace is that if the pattern is in the filename, Greplace fails, because you end up replacing it in the filename, too.
  • Nothing unusual here after 6 years, but this plugin is severely outdated in comparison to some new answers (github.com/yegappan/greplace) last update, 3+ years ago. I might check out the builtin solution by Sid: stackoverflow.com/a/38004355/2224331 (It's not me on another account, just a coincidence :P)
  • Thanks! I really need to learn this old school command line stuff. I think this is the best answer. Are these regexes perl regexes or vim regexes or some other kind of regex?
  • @EricJohnson: They're... sed regexes, which are essentially POSIX.2 basic regular expressions, but not exactly (this is in the manpage) - they let \n match newlines, and some other similar things. They're therefore pretty much the same as grep regular expressions.
  • Is there a reason you have -i in the sed command? The man page says that is for specifying an extension, but you don't appear to actually specify one.
  • Ok it actually looks like 's/pattern/replacement/' is the extension, I think I understand now.
  • On Mac OS X the only sed command that worked for me was: find . -type f | LANG=C xargs sed -i '' 's/SEARCH/REPLACE/g'
  • Plus you can add :cdo update to save the changes in all files.