如何在 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 的这个程序。