Vim/Vi搜索替换
对于经常使用命令行的用户来说,Vim是首选的文本编辑器。与其他编辑器不同,Vim有几种操作模式
对于经常使用命令行的用户来说,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
键跳过,按q
或Esc
退出。按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的单词,例如cygnus
,magnum
。
要搜索整个单词,请使用\<
标记单词的开头,\>
标记单词的结尾。例如,要搜索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
命令将会在整个文件搜索apple
,orange
和mango
,然后使用fruit
替换与模式匹配的项。
:%s/\s+$//e
这是一个非常有用的命令,它将在整个文件中搜索末尾的空白符并删除。\s
是正则表达式,匹配所有空白符,+
表示一个或者多个,$
表示行尾。
搜索和替换是Vim的强大功能,可让您快速更改文本。如有任何疑问,请随时发表评论。