如何在 Vim 中查找和替换文本

如何在 Vim 中搜索文本?

按 / 键,输入您的搜索文本,然后按 Enter。 这就像 less 命令一样。

但是这种查找文本的方法不允许您替换找到的结果。

让我分享 如何在 Vim 中查找和替换.

:%s/foo/bar/gci

上面的命令将运行不区分大小写的搜索,以查找所有出现的搜索词 (foo) 和新词 (bar)。 使用标志 c,它要求在替换任何替换之前进行确认。

让我更详细地解释一下。

在 Vim 中使用替换命令查找和替换文本

我猜你已经知道要在 Vim 中运行命令,你必须处于正常模式(也称为命令模式)。 按 Esc 键进入此模式。

Vim 有一个方便的命令 :substitue也可以与较短的版本一起使用 :s.

下面是替换命令的一般语法:

:[range]s/{pattern}/{string}/[flags] [count]

让我们分解一下这个语法。 方括号之间的任何内容 ‘[]’ 是可选的。

  • range : 如果你想在所述行之间进行替换,可以使用这部分语法。 如果您不提及范围,它将仅替换当前行上的文本. (我已经共享了一个范围表)
  • pattern : 在这里您可以指定要替换的文本。
  • string :这是将替换模式的字符串。
  • flags :要替换所有出现的搜索模式,请使用 g 旗帜。 您可以指定是否希望匹配忽略大小写,使用 i 旗帜。 要手动确认每个搜索和替换操作,请使用 c 旗帜。
  • count : 替换文本的行数。
范围描述
.当前行
$最后一行
%所有线路
X行号 x
.,+x从当前行到其他 x 行

Vim 中查找和替换的示例

让我们看几个例子来演示如何在 Vim 中使用替换命令。

下面是我将用来演示在 Vim 中使用替代命令的文件的屏幕截图。

基本文本替换

为了这 example,我确保字符串“Hello”至少在一行中出现了多次,并且在文件中出现了多次。

我想用字符串 ‘HI’ 替换 ‘Hello’。 下面是执行此操作的 Vim 命令:

:%s/Hello/HI/g

替换为确认

要替换文本,但每次都需要确认,您可以使用 c 在替换命令中。

:%s/Hello/HI/gc

正如您从视频中看到的那样,Vim 每次在替换模式之前都会要求我确认。

您还有一个类似于以下行的提示:

replace with HI (y/n/a/q/l/^E/^Y)?

提示中的选项具有以下含义:

  • 是的
  • n: 没有
  • 答:全部
  • q:不替换就退出,但是一旦你已经替换了文本就不会撤消
  • l:替换这个并退出(想想’last’)
  • ^E:向上滚动(在 vim-tiny)
  • ^Y:向下滚动(在 vim-tiny)

不区分大小写的替换

当你想替换文本时,不管它是大写还是小写,在这种情况下(哈哈)你应该使用 i 替代命令中的标志。

:%s/hello/HI/gi

如果您注意到,所有出现的 ‘hello’ 或 ‘Hello’ 甚至 ‘hELLO’ 都会被替换为 ‘HI’。 这是不区分大小写的模式替换。

每个“hello”都被替换为“HI”,即使大多数“hello”都有一个大写的“H”。

在 Vim 中替换单行文本

要替换单行中的文本,我们需要指定将替换范围限制为当前行的范围。

为此,最好使用 . 范围描述符。

:.s/Hello/HI/g
看看只有第一行是如何受到影响的

如您所见,只有第一行中的模式被替换,因为我使用了句点“。” 范围描述符。

额外提示:使用不同的分隔符

查看替代命令的语法,我提到模式和字符串由正斜杠“/”分隔。

但是,如果您的模式/字符串中有很多正斜杠的文本,比如路径,在文件中的任何地方都重复出现怎么办? 转义正斜杠可能很乏味,有时很容易错过。

因此,您可以使用不同的分隔符,而不是使用正斜杠字符作为分隔符。

我见过的一些分隔符是 #, _@.

这是一个显示使用演示的 gif @ 作为分隔符而不是 /.

结论

替换文本可能很常见,Vim 为您提供了一种用字符串搜索和替换模式的强大方法。 你甚至可以在 Vim 的替换命令中混合正则表达式。

如果您有兴趣学习的不仅仅是 Vim 基础知识,我强烈建议您使用 Jovica Ilic 的这个程序。