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

mu *_*u 無 300 vi vim

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

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

示例:从行替换文本6-10,14-18但不从中替换11-13.

小智 313

全部替换:

:%s/foo/bar/g
Run Code Online (Sandbox Code Playgroud)

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

对于特定的行:

:6,10s/foo/bar/g
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您打算复制并通过其他人的工作,您应该真正参考您的来源(即vim.wikia.com/wiki/Search_and_replace). (13认同)
  • `%`=&gt;在所有行上运行此命令。g'=&gt;匹配同一行中的多次出现。 (4认同)
  • / g这里的目的是什么?对不起,我是linux的新手 (3认同)
  • @RajaAnbazhagan在最后一个`/`之后,此表达式的最后一部分是用于指示操作标志的位置。该命令通常会替换一行上的_first_匹配项;使用`g`标志将替换所有出现的事件。 (3认同)
  • @RajaAnbazhagan 有人说过“g”是什么。为了更容易记住,它代表“global”,所以在整个文件中。 (3认同)
  • `%`东西起作用了!否则,这只是第一次出现。 (2认同)
  • @kishore `:s` 是 `:substitute` 命令的缩写。添加前缀(在本例中为“%”)是为了简单地指定要运行替代命令的**范围**。`:%s` =&gt; 在所有行上运行替换命令,`:1,8s` =&gt; 从第 1 行到第 8 行运行替换命令,依此类推。`%` 与 `1, $` 相同。您可以从此 wiki 页面阅读有关范围的更多信息 - https://vim.fandom.com/wiki/Ranges (2认同)

Ing*_*kat 227

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

:6,10s/<search_string>/<replace_string>/g | 14,18&&
Run Code Online (Sandbox Code Playgroud)

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

:for range in split('6,10 14,18')| exe range 's/<search_string>/<replace_string>/g' | endfor
Run Code Online (Sandbox Code Playgroud)

  • 很高兴你喜欢它!后续命令的`:`是可选的,顺便说一下,所以你可以节省更多的击键次数. (5认同)
  • 谢谢.注意将来的用户 - `:6,10s/<search_string>/<replace_string>/g | :14,18 && | :20,23 && | :28,31 &&`也可以工作,`for`循环使它更容易记忆和执行. (3认同)
  • @TayyarR 范围覆盖了行(可以说是垂直的),而 'g' 标志确定是仅替换行(水平的)内的一个或所有匹配项。 (3认同)
  • `:&amp;&amp;`每周可以为我节省数百次击键。谢谢! (2认同)

Att*_* O. 50

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

  • VISUAL模式(V)
  • VISUAL BLOCK模式(Ctrl+ V)
  • VISUAL LINE模式(Shift+ V,最适合您的情况)

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

:s/<search_string>/<replace_string>/g
Run Code Online (Sandbox Code Playgroud)

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

:'<,'>s/<search_string>/<replace_string>/g
Run Code Online (Sandbox Code Playgroud)

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

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

:.s/<search_string>/<replace_string>/g
Run Code Online (Sandbox Code Playgroud)

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

:'<,'>:s/<search_string>/<replace_string>/g
:.:s/<search_string>/<replace_string>/g
Run Code Online (Sandbox Code Playgroud)

  • &gt; 示例:替换第 6-10、14-18 行的文本,但不替换第 11-13 行的文本。——你的回答不正是回答了这个问题吗? (2认同)

Lie*_*ers 27

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

  :6,10s/<search_string>/<replace_string>/g
  :14,18s/<search_string>/<replace_string>/g
Run Code Online (Sandbox Code Playgroud)

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


小智 26

搜索和替换

:%s/search\|search2\|search3/replace/gci
Run Code Online (Sandbox Code Playgroud)

g => 全局搜索

c => 首先要求确认

i => 不区分大小写

如果你想直接替换而不确认,使用下面的命令

:%s/search/replace/g
Run Code Online (Sandbox Code Playgroud)

如果您想对每次替换进行确认,请运行以下命令

:%s/search/replace/gc
Run Code Online (Sandbox Code Playgroud)

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

:%s/search/replace/gci
Run Code Online (Sandbox Code Playgroud)


arn*_*nav 14

VI搜索并替换命令示例

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

第一[Esc]击键

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

:%s/foo/bar/

  • 你的`:%s/<search_string>/<replace_string>/g`命令将替换整个文件中的所有匹配项.不完全是问题的答案,但仍然有用:) (9认同)

SMJ*_*SMJ 14

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

 :%s/foo/bar/gc  
Run Code Online (Sandbox Code Playgroud)

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

:wq
Run Code Online (Sandbox Code Playgroud)

  • 除了指定范围之外,您实际上还可以使用 `c` 标志,因此 `:6,10s/&lt;search_string&gt;/&lt;replace_string&gt;/c` 可以工作。“c”代表“确认”。我经常使用“c”标志来防止意外替换我没有想到它们也存在的单词。 (2认同)

lin*_*ong 7

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

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

:.,+2s/foo/bar/g
Run Code Online (Sandbox Code Playgroud)

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

:.,+2s/foo/bar/gc
Run Code Online (Sandbox Code Playgroud)

  • 我经常使用的另一个好东西是 `:.,$s/foo/bar/gc` 来搜索和替换从当前行到文件末尾的内容。 (4认同)

Zha*_*ang 6

回答这个问题:

: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 或更早版本)。