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


Answers:


254

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

: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

5
谢谢。敬请将来的用户注意- 循环:6,10s/<search_string>/<replace_string>/g | :14,18&& | :20,23&& | :28,31&&也将使工作for更加容易记住和执行。
mu无

5
很高兴你喜欢它!将:在随后的命令是可选的,顺便说一句,这样可以节省一些按键。
Ingo Karkat 2013年

2
:&&每周将为我节省数百次击键。谢谢!
pdoherty926

它在我的vim末尾没有'g'时有效。因此,当您指定行范围时,它不需要全局标志
Tayyar R

3
@TayyarR该范围覆盖了行(可以这么说),而'g'标志确定是仅替换行中的一个或所有匹配项(水平)。
Ingo Karkat

385

全部替换:

:%s/foo/bar/g

找到所有出现的“ foo”(在所有行中),然后将其替换为“ bar”。

对于特定行:

:6,10s/foo/bar/g

将第6行到第10行(包括第6行)的所有行的每个“ foo”更改为“ bar”。


3
/ g的目的是什么?抱歉,我是Linux的
新手

4
@RajaAnbazhagan在最后一个表达式之后,该表达式的最后一部分/是用于指示操作标志的位置。该命令通常会替换一行中的第一个匹配项;使用该g标志将替换所有出现的事件。
Litty

17
如果您要复制并通过他人的作品,则应真正参考您的资料来源(即vim.wikia.com/wiki/Search_and_replace)。
安德鲁S

2
%事情做的工作!否则,这只是第一次出现。
Santosh Kumar

7
%=>在所有行上运行此命令。g=>匹配同一行中的多个事件。
Shaahiin

55

作为旁注,无需键入行号,只需在一种可视模式下突出显示要查找/替换的行:

  • 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

还要注意的另一点是,:在range和find / replace命令之间插入秒数没有任何危害,换句话说,这些命令仍然可以使用:

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

1
>示例:替换第6-10行,第14-18行的文本,而不是第11-13行的文本。-您的回复没有回答这个问题吗?
poige '16

27

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

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

第二次您需要调整的是范围,所以我不用回显全部内容,而是回想上一条命令并仅编辑范围


20

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

 :%s/foo/bar/gc  

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

:wq

1
c除了指定范围之外,您实际上还可以使用该标志,因此:6,10s/<search_string>/<replace_string>/c可以正常工作。c代表confirm。我c经常使用该标志来防止意外替换那些我不认为它们也存在的单词。
沃尔夫森

16

VI搜索和替换命令示例

假设您要查找一个名为“ foo”的单词并替换为“ bar”。

第一[Esc]击键

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

:%s/foo/bar/


11
您的:%s/<search_string>/<replace_string>/g命令将替换整个文件中的所有匹配项。并非完全是问题的答案,但仍然有用:)
tanius

@tanius实际上,这是对我的问题最直接的答案。您可以考虑将问题修改为“在“选定”行上的vim中查找和替换字符串”
Omid N

9

我们不需要麻烦输入当前行号。

如果你想改变每foobar当前行(.)和两个下一行(+2),简单地做:

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

如果要在更改之前确认,请替换ggc

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

我经常使用的另一件事是:.,$s/foo/bar/gc从当前行开始到文件末尾进行搜索和替换。
Wolfson

3

搜索并替换

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

g =>全局搜索

c =>首先要求确认

我=>不区分大小写

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

:%s/search/replace/g

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

:%s/search/replace/gc

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

:%s/search/replace/gci

1

通过视觉选择指定范围是可以的,但是当操作员可以选择仅几行的非常简单的操作时,最好将这些命令用作操作员。

可悲的是,这不能通过标准的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,该插件可以执行相同的操作, 但方式更简单。


0

要回答这个问题:

:40,50s/foo/bar/g

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

:50,40s/foo/bar/g

同样有效,vim会要求您确认,然后为您进行替换,就好像您输入了第一个命令一样。

:,50s/foo/bar/g

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

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

请注意,在varpper中

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

:50,40s/foo/bar/g 无需确认即可工作。

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


-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.)代替。


我不确定这是否能回答问题。从这个问题看来,询问的人似乎已经知道如何使用%s修改输入,但想知道如何“半全局地”进行修改(即,他的规范是6-10和14-18行,而不是11-行) 13)。
Brandon Buck

1
还有什么是“命令”?而且您正在患牙签综合症
马丁·图尔诺伊

要治治综合征,您可以使用其它字符作为分隔符,而不是默认/,如!@_:%s_/sys/sim/source/gm/kg/jl/ls/owow/lsal_sys.pkg.mpu.umc.kdk_g
MortezaE
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.