本文介绍了如何在Vim/Vi中查找和替换文本。

Vim是最受欢迎的命令行文本编辑器。 它预装在macOS和大多数Linux发行版上。 在Vim中查找和替换文本非常容易。

基本查找和替换

在Vim中,可以使用:substitute:s)命令来查找和替换文本。

要在Vim中运行命令,必须处于normal模式,这是启动编辑器时的默认模式。 要从其他任何模式返回normal模式,只需按“ Esc”键。

替换命令的一般形式如下:

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

该命令在[range]中的每一行中搜索{pattern},并将其替换为{string}。 是与命令[count]相乘的正整数。

如果未给出[range][count],则仅替换当前行中找到的pattern。 当前行是光标所在的行。

例如,要在当前行中搜索字符串“ foo”的第一个匹配项,并将其替换为“ bar”,则可以使用:

:s/foo/bar/

要替换当前行中所有出现的搜索模式,请添加g标志:

:s/foo/bar/g

如果要搜索并替换整个文件中的所有匹配的模式,请使用百分比字符%作为range。 此字符表示从文件的第一行到最后一行的范围:

:%s/foo/bar/g

如果省略{string}部分,则将其视为空字符串,并删除匹配的模式。 以下命令删除当前行中字符串“ foo”的所有匹配:

:s/foo//g

除了斜杠字符(/),您还可以使用任何其他非字母数字的单字节字符作为分隔符。 当您在搜索模式中包含“ /”字符或替换字符串时,此选项很有用。

:s|foo|bar|

要确认每次替换,请使用c标志:

:s/foo/bar/gc
replace with bar (y/n/a/q/l/^E/^Y)?

y替换匹配项,或按l替换匹配项并退出。 按n跳过,按qEsc退出。 a选项替换匹配项和所有其余匹配项。 要向下滚动屏幕,请使用CTRL+Y,要向上滚动,请使用CTRL+E

您还可以使用正则表达式作为搜索模式。 下面的命令将所有以“ foo”开头的行替换为“ Vim is the best”:

:%s/^foo.*/Vim is the best/gc

^(脱字符)符号与行的开头匹配,.*与任意数目的任何字符匹配。

区分大小写

默认情况下,搜索操作区分大小写; 搜索“ FOO”将不匹配“ Foo”。

要忽略搜索模式的大小写,请使用i标志:

:s/Foo/bar/gi

强制忽略大小写的另一种方法是在搜索模式后附加\c。 例如,/Linux\c执行忽略大小写搜索。

如果您更改了默认大小写设置,并且想要执行区分大小写的搜索,请使用I标志:

:s/foo/bar/gi

模式后的大写\C也会强制进行大小写匹配搜索。

搜索范围

未指定范围时,替代命令仅在当前行中运行。

范围可以是一行或两行之间的范围。 行说明符用,;字符分隔。 可以使用绝对行号或特殊符号来指定范围。

例如,要将从第3行到第10行的所有行中所有出现的“ foo”替换为“ bar”,您可以使用:

:3,10s/foo/bar/g

该范围包括所有内容,这意味着该范围包括第一行和最后一行。

.字符表示当前行,而$-美元符号表示最后一行。 在从当前行到最后一行的所有行中替换“ foo”:

:.,$s/foo/bar/

还可使用“ +”或“-”符号来设置行说明符,其后是从前一个行号中添加或减去的数字。 如果省略符号后的数字,则默认为1。

例如,要从当前行和接下来的四行开始,用“ bar”替换每个“ foo”,请输入:

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

替换整个单词

替代命令将模式查找为字符串,而不是整个单词。 例如,如果您正在搜索“ gnu”,则搜索结果匹配“ gnu”嵌入较大词(例如“ cygnus”或“ magnum”)中的内容。

要搜索整个单词,请键入\<标记单词的开头,输入搜索模式,键入\>标记单词的结尾:

例如,要搜索“ foo”一词,您可以使用\<foo\>

:s/\<foo\>/bar/

替代历史

Vim跟踪您在当前会话中运行的所有命令。 要浏览历史记录以查找先前的替代命令,请输入:s,然后使用向上/向下箭头键查找先前的替代操作。 要运行命令,只需按Enter。 您也可以在执行操作之前编辑命令。

范例

注释行(在行前添加#)从5到20:

:5,20s/^/#/

取消注释的第5行到第20行,恢复之前的更改:

:5,20s/^#//

将“苹果”,“橙色”和“芒果”的所有实例替换为“水果”:

:%s/apple\|orange\|mango/fruit/g

删除每行末尾的尾随空格:

:%s/\s\+$//e

结论

搜索和替换是Vim的强大功能,可让您快速更改文本。

如有任何疑问,请随时发表评论。