关于vi:在多行中查找并替换vim中的字符串

Find and replace strings in vim on multiple lines

我可以用:%s///g替换文件中的字符串,或者:s///替换当前行。

如何在vim中选择和替换选择行中的单词?

示例:替换6-1014-18行中的文本,但不替换11-13中的文本。


全部替换:

1
:%s/foo/bar/g

查找每个'foo'(在所有行中),并将其替换为'bar'。

对于特定的行:

1
:6,10s/foo/bar/g

对于从第6行到第10行的所有行,将每个'foo'更改为'bar'。


:&&命令使用相同的标志重复最后一次替换。您可以为其提供额外的范围(并根据需要连接多个):

1
:6,10s/<search_string>/<replace_string>/g | 14,18&&

如果你有很多范围,我宁愿使用一个循环:

1
: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,在您的情况下效果最佳)

选择要替换的行后,键入以下命令:

1
:s/<search_string>/<replace_string>/g

您会注意到'<,'>范围将自动为您插入:

1
:'<,'>s/<search_string>/<replace_string>/g

这里'<仅表示第一个突出显示的行,'>表示最后突出显示的行。

请注意,在NORMAL模式下,行为可能是意外的:'<'>指向在VISUAL模式之一中完成的最后一个高亮显示的开始和结束。相反,在NORMAL模式下,可以使用特殊行号.,这仅表示当前行。因此,您只能在当前行上查找/替换,如下所示:

1
:.s/<search_string>/<replace_string>/g

另外需要注意的是在范围和find / replace命令之间插入第二个:没有坏处,换句话说,这些命令仍然有效:

1
2
:'<,'>:s/<search_string>/<replace_string>/g
:.:s/<search_string>/<replace_string>/g


您可以使用两个查找/替换序列来完成此操作

1
2
  :6,10s/<search_string>/<replace_string>/g
  :14,18s/<search_string>/<replace_string>/g

第二次你需要调整的是范围所以不是全部输入,我会记得最后一个命令并只编辑范围


如果您对所有线路都会受到影响感到困惑,请在下方使用

1
 :%s/foo/bar/gc

将每个'foo'更改为'bar',但首先要求确认。
按'y'表示是,'n'表示否。别忘了在那之后保存

1
:wq

VI搜索并替换命令示例

我们假设您想要找到一个名为"foo"的单词并替换为"bar"。

先点击[Esc]

键入:(冒号)后跟%s/foo/bar/并按[Enter]键

:%s/foo/bar/


我们不需要打扰输入当前行号。

如果要将当前行(.)和下两行(+2)的每个foo更改为bar,只需执行以下操作:

1
:.,+2s/foo/bar/g

如果要在进行更改之前进行确认,请将g替换为gc

1
:.,+2s/foo/bar/gc

通过视觉选择指定范围是可以的,但是如果有的话
简单的操作只需几行就可以选择
运算符最好是将这些命令应用为运算符。

遗憾的是,这不能通过标准的vim命令来完成。你可以做一个排序
解决方法使用! (过滤器)运算符和任何文本对象。对于
例如,要将操作应用于段落,您可以执行以下操作:

1
!ip

这必须被解读为"在一个段落中应用操作符!"。过滤器
操作员启动命令模式并自动插入行范围
然后是文字"!"您可以在之后删除。
如果您将此应用于以下段落:

1
2
3
4
5
6
7
8
9
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"后的结果如下:

1
:.,.+5

作为'。' (point)表示当前行,当前行之间的范围
行和后面的5行将用于操作。现在你可以添加
替换命令与以前一样。

不好的是,为后者选择文本并不容易
应用运营商。好的部分是这可以重复插入
其他类似文本范围(在本例中为段落)的范围
大小不一样。即,如果您以后想要选择更大的范围
段落'。'会是对的。

此外,如果您喜欢使用语义文本对象来选择
操作范围,你可以检查我的插件
EXtend.vim可以做同样的事情
但是以一种更容易的方式。


1
2
3
4
5
6
7
8
/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.)。