在多行上查找和替换vim中的字符串

时间:2013-11-15 06:34:20

标签: vim vi

我可以:%s/<search_string>/<replace_string>/g替换文件中的字符串,或:s/<search_string>/<replace_string>/替换当前行。

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

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

11 个答案:

答案 0 :(得分:280)

全部替换:

:%s/foo/bar/g

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

具体行:

:6,10s/foo/bar/g

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

答案 1 :(得分:206)

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

: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

答案 2 :(得分:45)

作为旁注,不要输入行号,只需在其中一种视觉模式中突出显示要查找/替换的行:

  • VISUAL 模式( V
  • VISUAL BLOCK 模式( Ctrl + V
  • VISUAL LINE 模式( Shift + V ,在您的情况下效果最佳)

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

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

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

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

此处'<仅表示第一个突出显示的行'>表示最后突出显示的行

请注意,在 NORMAL 模式下,行为可能会出现意外:'<'>指向上一个高亮显示的开头和结尾 VISUAL 模式。相反,在 NORMAL 模式下,可以使用特殊行号.,这意味着当前行。因此,您只能在当前行上找到/替换:

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

另一件需要注意的事情是在范围和find / replace命令之间插入第二个:没有坏处,换句话说,这些命令仍然可以工作:

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

答案 3 :(得分:27)

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

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

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

答案 4 :(得分:15)

搜索并替换

:%s/search\|search2\|search3/replace/gci

g =>全局搜索

c =>首先要求确认

i =>不区分大小写

如果您想不经确认直接更换,请使用以下命令

:%s/search/replace/g

如果要确认每次更换,请运行以下命令

:%s/search/replace/gc

请先确认,此处搜索将不区分大小写。

:%s/search/replace/gci

答案 5 :(得分:11)

VI搜索并替换命令示例

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

首先点击[Esc]

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

:%s/foo/bar/

答案 6 :(得分:10)

在vim中,如果您对将影响所有行感到困惑,请在下面使用

var triangles = new List<Triangles>();

将每个“ foo”更改为“ bar”,但首先要求确认。 按“ y”表示是,按“ n”表示否。之后不要忘记保存

 :%s/foo/bar/gc  

答案 7 :(得分:6)

我们无需费心输入当前行号。

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

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

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

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

答案 8 :(得分: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

为“。” (点)表示当前行,当前行之间的范围 行和之后的5行将用于操作。现在您可以添加 替代命令与以前相同。

不好的地方是,为后者选择文本并不容易 应用运算符。好的部分是,这可以重复插入 其他类似文本范围(在本例中为段落)的范围 大小明显不同。也就是说,如果您以后要选择更大的范围 “。”段会正确的。

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

答案 9 :(得分:0)

要回答此问题:

:40,50s/foo/bar/g

在第40行和第50行(包括50行)之间的这些行中用bar替换foo,执行此命令时,您现在可以在任何行中。

:50,40s/foo/bar/g

也可以使用,vim会要求您确认,然后为您进行替换,就好像您输入了第一个命令一样。

:,50s/foo/bar/g

在当前行和第50行(包括第50行)之间的这些行中,用替换foo。 (如果您位于第50行之后,vim会再次要求您确认)

要清除vim和Eclipse的vrapper插件之间的区别:

请注意,在varpper中

:,50s/foo/bar/g命令将不起作用。

:50,40s/foo/bar/g将在不需要确认的情况下工作。

(对于Vrapper 0.74.0或更早版本)。

答案 10 :(得分:-5)

/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.)。