myfreax
vim

Vim/Vi搜索替换

对于经常使用命令行的用户来说,Vim是首选的文本编辑器。与其他编辑器不同,Vim有几种操作模式

9 min read
By myfreax
Vim/Vi搜索替换
Vim/Vi搜索替换

对于经常使用命令行的用户来说,Vim是首选的文本编辑器。与其他编辑器不同,Vim有几种操作模式。

Vim或其前身Vi都已预装在所有MacOS/Linux发行版上。如果遇到您最喜欢的编辑器不可用的情况,了解Vim的基础知识将会对您有所帮助。

Vim是从vi发展出来的一个文本编辑器。其代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和Emacs并列成为类Unix系统用户最喜欢的编辑器。

本教程介绍如何在Vim/Vi中查找和替换文本。对新用户来说可能有点困难,所以给它一个神的编辑器代名词也不奇怪。但在Vim中查找和替换文本非常容易的事。

Vim模式

启动Vim编辑器时,您处于命令模式。在命令模式下,您可以使用vim命令并浏览文件,设置行号,执行搜索替换,保存文件按,退出vim的命令。

如你需要输入文字,修改文件内容,您需要按i键进入插入模式。在插入模式时,您可以像在常见文本编辑器一样插入和删除文件的内容与文本。

在Vim还要一种模式称为可视模式,该模式对于不常使用vim的用户比较少使用。可视模式多在复制或者粘帖内容时使用。它可显示你复制或者插入文件的位置。

如果你要从插入模式或者可视模式返回到命令模式,请按Esc键。这里分享一个技巧,如果按一次Esc键还没有返回到命令模式,那尝试按Esc键多次。

vim搜索替换语法

在Vim中,可以使用:substitute或者简写:s命令来查找和替换文本,substitute即替换的意思。

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

这是vim替换命令的基本形式:[range]s/{pattern}/{string}/[flags]

[range]表示搜索范围,允许你指定搜索替换的范围,可以是整个文件,或者是指定的行,如果没有给出[range],将在光标所在行进行搜索替换。

{pattern}表示搜索的模式,它可以正则表达式,字符串,单词。也可以是任意字符串。

{string}允许你指定字符串替换与模式匹配项。它可以是任意字符,包括空白字符串。当没有指定该参数时,将会删除与模式匹配的项。

[flags]标识允许你指定搜索的正则表达式的标识之外,还允许你修改命令的交换方式。

值得一提的是如果未给出范围[range],vim仅对光标所在行进行搜索替换的操作,也只是对光标所在行的第一个与模式匹配的字符串进行替换。

如果你需要对光标所在行,即当前行中,出现与搜索模式匹配项,请在运行搜索替换命令时添加g标志。

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

:s/foo/bar/ #仅替换光标所在行的第一个匹配项
:s/foo/bar/g #替换光标所在行的所有匹配项

如果要搜索并替换整个文件中所有与模式匹配的字符串,请使用百分比字符%作为搜索替换的范围参数,即[range]参数。

百分比字符%表示从文件的第一行到最后一行的范围进行搜索替换。例如vim命令:%s/foo/bar/g,将会在整个文件中进行搜索替换的操作。

如果省略{string}参数,则将其视为空字符串。这将会删除与模式匹配字符串。也就是说,你将与模式匹配的字符串替换为空。

例如以下vim命令删除当前行中与模式foo匹配的字符串:

:%s/foo/bar/g #在整个文件中搜索替换foo
:s/foo//g #将光标当前行的foo替换为空字符串

vim搜索替换的分隔符

除了斜杠字符/,您还可以使用任何其他非字母数字字符作为分隔符。当您在搜索模式中包含/字符或者替换字符串中包含/时。

使用其它的字符串作为vim搜索替换命令的分隔符会非常有用,你不必转义/。也可以让你的搜索替换命令更易于阅读。

例如vim搜索替换命令:%s#//#bar#g。该命令将会在整个文件搜索//字符串,并替换bar。这样就可以不必对/进行转义。

交互式替换

有时候,你不确定你的模式是否会正确到匹配到你需要字符串,这时你就可以使用vim交互式的搜索替换。

要每次确认vim的替换操作,你可以使用c标识作为vim搜索替换命令标识的参数即[Flag]

当你添加c作为标识参数时,vim的搜索命令将会向你展示一个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标志。

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

如果您更改了默认大小写设置,并且想要执行区分大小写的搜索,请使用I标志。模式后的大写\C也会强制进行大小写匹配搜索。

:s/Foo/bar/gi将会忽略大小写进行搜索,与该命令的使用小写\c等价命令是:s/Foo\c/bar/g

搜索范围

如果你未指定范围时,即[range]参数,vim的搜索替换命令仅在光标所在行进行搜索替换的操作。

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

如果你在使用绝对行号作为搜索范围的参数时,我们建议你打开vim的行号显示。如果你屏幕太小时你可能会得一个错误的行号。

在vim可以使用.或者$+-的特殊符号指定要搜索的范围。点.符号表示在光标所在开始。$表示最后文件的最后一行。

加减符号+-用于表示相对与光标所在行加或者减少多少行。你同时使用这些特殊的符号指定搜索的范围。如果省略+-符号后的数字,则默认为加减1行。

例如:3,10s/foo/bar/g,这是指定绝对行号的命令。将从第3行到第10行中与模式foo匹配的项替换为bar

这是一个使用使用特殊符号的命令:.,$s/foo/bar/g,点.字符表示光标所在行,而$美元符号表示最后一行。将会从光标所在行到最后一行中搜索foo模式然后替换为 bar

又例如命令:.,+4s/foo/bar/g表示从光标所在行开始搜索,并在光标所在行加4行然后结束搜索模式foo,并用bar替换与模式匹配的项。

替换整个单词

替代命令将模式查找为字符串,而不是整个单词。例如,如果您正在搜索gnu,则搜索结果会匹配包含gnu的单词,例如cygnusmagnum

要搜索整个单词,请使用\<标记单词的开头,\>标记单词的结尾。例如,要搜索foo一词,您可以使用\<foo\>

:s/\<foo\>/bar/

替换历史

Vim跟踪您在当前会话中运行的所有命令。要浏览历史记录以查找之前运行过的的搜索替换命令。

请输入:s,然后使用向上/向下箭头键查找之前前的搜索替换命令。当搜索之前的命令后,如需要运行命令,只需按Enter。 您也可以在执行操作之前编辑命令。

范例

:5,20s/^/#/该命令将在5到20行前添加#,这相当与为注释shell脚本的5-20行的代码。如果你需要取消第5行到第20行的注释,恢复之前的更改,运行命令:5,20s/^#//

:%s/apple|orange|mango/fruit/g命令将会在整个文件搜索appleorangemango,然后使用fruit替换与模式匹配的项。

:%s/\s+$//e这是一个非常有用的命令,它将在整个文件中搜索末尾的空白符并删除。\s是正则表达式,匹配所有空白符,+表示一个或者多个,$表示行尾。

搜索和替换是Vim的强大功能,可让您快速更改文本。如有任何疑问,请随时发表评论。