可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I can do :%s/<search_string>/<replace_string>/g
for replacing a string across a file, or :s/<search_string>/<replace_string>/
to replace in current line.
How can I select and replace words from selective lines in vim?
Example: replace text from lines 6-10
, 14-18
but not from 11-13
.
回答1:
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
回答2:
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.
回答3:
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
回答4:
You can do it with two find/replace sequences
:6,10s/<search_string>/<replace_string>/g
:14,18s/<search_string>/<replace_string>/g
The second time all you need to adjust is the range so instead of typing it all out, I would recall the last command and edit just the range
回答5:
VI search and replace command examples
Let us say you would like to find a word called “foo” and replace with “bar”.
First hit [Esc] key
Type : (colon) followed by %s/foo/bar/ and hit [Enter] key.
:%s/foo/bar/
回答6:
In vim if you are confused which all lines will be affected, Use below
:%s/foo/bar/gc
Change each 'foo' to 'bar', but ask for confirmation first.
Press 'y' for yes and 'n' for no. Dont forget to save after that
:wq
回答7:
We don't need to bother entering the current line number.
If you would like to change each foo
to bar
for current line (.
) and the two next lines (+2
), simply do:
:.,+2s/foo/bar/g
If you want to confirm before changes are made, replace g
with gc
:
:.,+2s/foo/bar/gc
回答8:
Specifying the range through visual selection is ok but when there are very
simple operations over just a couple of lines that can be selected by an
operator the best would be to apply these commands as operators.
This sadly can't be done through standards vim commands. You could do a sort
of workaround using the ! (filter) operator and any text object. For
example, to apply the operation to a paragraph, you can do:
!ip
This has to be read as "Apply the operator ! inside a paragraph". The filter
operator starts command mode and automatically insert the range of lines
followed by a literal "!" that you can delete just after.
If you apply this, to the following paragraph:
1
2 Repellendus qui velit vel ullam!
3 ipsam sint modi! velit ipsam sint
4 modi! Debitis dolorum distinctio
5 mollitia vel ullam! Repellendus qui
6 Debitis dolorum distinctio mollitia
7 vel ullam! ipsam
8
9 More text around here
The result after pressing "!ap" would be like:
:.,.+5
As the '.' (point) means the current line, the range between the current
line and the 5 lines after will be used for the operation. Now you can add
the substitute command the same way as previously.
The bad part is that this is not easier that selecting the text for latter
applying the operator. The good part is that this can repeat the insertion
of the range for other similar text ranges (in this case, paragraphs) with
sightly different size. I.e., if you later want to select the range bigger
paragraph the '.' will to it right.
Also, if you like the idea of using semantic text objects to select the
range of operation, you can check my plugin
EXtend.vim that can do the same
but in an easier manner.
回答9:
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
Suppose if you want to replace the above with some other info.
COMMAND(:%s/\/sys\/sim\/source\/gm\/kg\/jl\/ls\/owow\/lsal/sys.pkg.mpu.umc.kdk./g)
In this the above will be get replaced with (sys.pkg.mpu.umc.kdk.
) .