Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Search and replace in vim in specific lines

Tags:

vim

People also ask

How do I search for a specific line in Vim?

Vi/Vim provides the G command in order to navigate or jump to the specified line number. First press the ESC key in order to change command mode and then type the line number you want to jump to. The last step is using typing G or gg. In the following example, we will jump to line number 40.

How do you do a search and replace string in Vim?

Search for text using / or for a word using * . In normal mode, type cgn (change the next search hit) then immediately type the replacement. Press Esc to finish. From normal mode, search for the next occurrence that you want to replace ( n ) and press . to repeat the last change.

How do I find and replace every incident of a text string vim?

When you want to search for a string of text and replace it with another string of text, you can use the syntax :[range]s/search/replace/. 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.

How do I highlight and replace in Vim?

By pressing ctrl + r in visual mode, you will be prompted to enter text to replace with. Press enter and then confirm each change you agree with y or decline with n .


Vim has special regular expression atoms that match in certain lines, columns, etc.; you can use them (possibly in addition to the range) to limit the matches:

:5,12s/\(\%5l\|\%12l\)foo/bar/g

See :help /\%l


You can do the substitution on line 5 and repeat it with minimal effort on line 12:

:5s/foo/bar
:12&

As pointed out by Ingo, :& forgets your flags. Since you are using /g, the correct command would be :&&:

:5s/foo/bar/g
:12&&

See :help :& and friends.


You could always add a c to the end. This will ask for confirmation for each and every match.

:5,12s/foo/bar/gc

Interesting question. Seems like there's only range selection and no multiple line selection:

http://vim.wikia.com/wiki/Ranges

However, if you have something special on line 5 and 12, you could use the :g operator. If your file looks like this (numbers only for reference):

 1     line one
 2     line one
 3     line one
 4     line one
 5     enil one
 6     line one
 7     line one
 8     line one
 9     line one
10     line one
11     line one
12     enil one

And you want to replace one by eno on the lines where there's enil instead of line:

:g/enil/s/one/eno/

You could use ed - a line oriented text editor with similar commands to vi and vim. It probably predates vi and vim.

In a script (using a here document which processes input till the EndCommand marker) it would look like:

ed file <<EndCommands
    5
    s/foo/bar/g
    7
    s/foo/bar/g
    wq
EndCommands

Obviously, the ed commands can be used on the command line also.