Find and replace strings in vim on multiple lines
Replace All:
:%s/foo/bar/g
Find each occurrence of 'foo' (in all lines), and replace it with 'bar'.
For specific lines:
:6,10s/foo/bar/g
Change each 'foo' to 'bar' for all lines from line 6 to line 10 inclusive.
As a side note, instead of having to type in the line numbers, just highlight the lines where you want to find/replace in one of the visual modes:
VISUAL
mode (V)VISUAL BLOCK
mode (Ctrl+V)VISUAL LINE
mode (Shift+V, works best in your case)
Once you selected the lines to replace, type your command:
:s/<search_string>/<replace_string>/g
You'll note that the range '<,'>
will be inserted automatically for you:
:'<,'>s/<search_string>/<replace_string>/g
Here '<
simply means first highlighted line, and '>
means last highlighted line.
Note that the behaviour might be unexpected when in NORMAL
mode: '<
and '>
point to the start and end of the last highlight done in one of the VISUAL
modes. Instead, in NORMAL
mode, the special line number .
can be used, which simply means current line. Hence, you can find/replace only on the current line like this:
:.s/<search_string>/<replace_string>/g
Another thing to note is that inserting a second :
between the range and the find/replace command does no harm, in other words, these commands will still work:
:'<,'>:s/<search_string>/<replace_string>/g
:.:s/<search_string>/<replace_string>/g
Search and replace
:%s/search\|search2\|search3/replace/gci
g => global search
c => Ask for confirmation first
i => Case insensitive
If you want direct replacement without confirmation, use below command
:%s/search/replace/g
If you want confirmation for each replace then run the below command
:%s/search/replace/gc
Ask for confirmation first, here search will be case insensitive.
:%s/search/replace/gci
The :&&
command repeats the last substitution with the same flags. You can supply the additional range(s) to it (and concatenate as many as you like):
:6,10s/<search_string>/<replace_string>/g | 14,18&&
If you have many ranges though, I'd rather use a loop:
:for range in split('6,10 14,18')| exe range 's/<search_string>/<replace_string>/g' | endfor