我可以:%s/<search_string>/<replace_string>/g
在文件中替换字符串,或者:s/<search_string>/<replace_string>/
在当前行中替换。
如何从 vim 中的选择行中选择和替换单词?
示例:从 lines 替换文本6-10
,14-18
但不是从11-13
.
全部替换:
:%s/foo/bar/g
查找每次出现的“foo”(在所有行中),并将其替换为“bar”。
对于特定行:
:6,10s/foo/bar/g
将第 6 行到第 10 行(含)的所有行的每个“foo”更改为“bar”。
该:&&
命令使用相同的标志重复上次替换。您可以为其提供额外的范围(并根据需要连接任意数量):
:6,10s/<search_string>/<replace_string>/g | 14,18&&
如果你有很多范围,我宁愿使用循环:
:for range in split('6,10 14,18')| exe range 's/<search_string>/<replace_string>/g' | endfor
作为旁注,不必输入行号,只需突出显示要在其中一种视觉模式中查找/替换的行:
VISUAL
模式 ( V)VISUAL BLOCK
模式 ( Ctrl+ V)VISUAL LINE
模式(Shift+ V,在您的情况下效果最好)选择要替换的行后,键入命令:
:s/<search_string>/<replace_string>/g
您会注意到该范围'<,'>
将自动为您插入:
:'<,'>s/<search_string>/<replace_string>/g
这里'<
简单地表示第一条突出显示的行,并'>
表示最后突出显示的行。
请注意,在NORMAL
mode: 下该行为可能是意外的,'<
并'>
指向在其中一种VISUAL
模式下完成的最后一个突出显示的开始和结束。相反,在mode 中,可以使用NORMAL
特殊的行号,这只是表示当前行。因此,您只能在当前行上查找/替换,如下所示:.
:.s/<search_string>/<replace_string>/g
另一件需要注意的是,在范围和查找/替换命令之间插入一秒:
并没有什么害处,换句话说,这些命令仍然可以工作:
:'<,'>:s/<search_string>/<replace_string>/g
:.:s/<search_string>/<replace_string>/g
:%s/search\|search2\|search3/replace/gci
g => 全局搜索
c => 先请求确认
i => 不区分大小写
:%s/search/replace/g
:%s/search/replace/gc
:%s/search/replace/gci
您可以使用两个查找/替换序列来完成
:6,10s/<search_string>/<replace_string>/g
:14,18s/<search_string>/<replace_string>/g
第二次你需要调整的是范围,所以我不会全部输入,我会回忆最后一个命令并只编辑范围
在 vim 中,如果您对哪些行会受到影响感到困惑,请在下面使用
:%s/foo/bar/gc
将每个 'foo' 更改为 'bar',但首先要求确认。按“y”表示是,按“n”表示否。之后别忘了保存
:wq
VI 搜索和替换命令示例
假设您想找到一个名为“foo”的单词并替换为“bar”。
第一[Esc]
击键
键入:(冒号),然后按%s/foo/bar/
[Enter] 键
:%s/foo/bar/
我们不需要费心输入当前行号。
如果您想将每个更改foo
为bar
当前行 ( .
) 和下两行 ( +2
),只需执行以下操作:
:.,+2s/foo/bar/g
如果要在进行更改之前进行确认,请替换g
为gc
:
:.,+2s/foo/bar/gc
要回答这个问题:
:40,50s/foo/bar/g
在第 40 行和第 50 行(含)之间的这些行中将 foo 替换为 bar,当执行此命令时,您当前可以在任何行中。
:50,40s/foo/bar/g
也可以,vim 会要求您确认,然后为您进行替换,就像您输入了第一个命令一样。
:,50s/foo/bar/g
在您当前所在的行和第 50 行(含)之间的这些行中,将 foo 替换为 bar。(如果你在第 50 行之后的一行,vim 会再次要求确认)
要明确 vim 和 Eclipse 的 vrapper 插件之间的区别:
请注意,在 varpper
:,50s/foo/bar/g
命令将不起作用。
:50,40s/foo/bar/g
无需征求确认即可工作。
(对于 Vrapper 版本 0.74.0 或更早版本)。
通过视觉选择指定范围是可以的,但是当操作员可以选择仅几行非常简单的操作时,最好将这些命令作为操作员应用。
遗憾的是,这不能通过标准的 vim 命令来完成。您可以使用 ! (过滤器)运算符和任何文本对象。例如,要将操作应用于段落,您可以执行以下操作:
!ip
这必须读作“在段落中应用运算符!”。过滤器运算符启动命令模式并自动插入行范围,后跟文字“!” 您可以在之后删除。如果您将此应用于以下段落:
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
按下“!ap”后的结果如下:
:.,.+5
作为'。(point) 表示当前行,当前行和后面的5行之间的范围将用于操作。现在您可以像以前一样添加替换命令。
不好的部分是这并不容易选择文本以便稍后应用运算符。好的部分是,这可以重复插入其他类似文本范围(在本例中为段落)大小明显不同的范围。即,如果您以后要选择范围更大的段落,请使用“。” 会正确的。
此外,如果您喜欢使用语义文本对象来选择操作范围的想法,您可以查看我的插件 EXtend.vim,它可以做同样的事情,但方式更简单。
/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
假设您想用其他信息替换上面的内容。
COMMAND(:%s/\/sys\/sim\/source\/gm\/kg\/jl\/ls\/owow\/lsal/sys.pkg.mpu.umc.kdk./g)
在此上面将被替换为 ( sys.pkg.mpu.umc.kdk.
) 。