原文传送门:Link
本文介绍了如何在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
跳过,按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
六、结论
搜索和替换是Vim的强大功能,可让您快速更改文本。