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/gc
要确认每次替换,请使用
c
标志:
:s/foo/bar/gc
replace with bar (y/n/a/q/l/^E/^Y)?
按
y
替换匹配项,或按l
替换匹配项并退出。按n
跳过,按q
或Esc
退出。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