在UNIX问世的前一年,1969年,Ken Thompson将正则表达式整合入QED文本编辑器。在Linux文本编辑器ed中,如果你希望显示包含字母“re”的行时,需要使用命令g/re/p
,而grep也因此得名。可以看作此操作的缩写:g (globally), / (search), re (regular expression), / (delimit search), p (print)。
Vim提供以下两种grep(globally search a regular expression and print)搜索工具:
:vimgrep
使用Vim内置的grep实现;:grep
调用外部的grep工具。:grep命令会运行由选项grepprg所指定的程序。在Linux系统上,grepprg默认是grep -n:
在Windows系统上,grepprg默认是findstr /n
:vimgrep命令使用vim内置的搜索引擎,与/
命令功能一致,但速度相对较慢。
由此可见,使用:vimgrep命令在不同平台上将获得一致的体验。而:grep命令则是与操作系统相关的,在不同平台会有不同的行为。
:grep
和:vimgrep
命令,都将在QuickFix中显示搜索结果。
:lgrep
和:lvimgrep
命令实现相同的功能,但使用地址列表(Location List)来显示匹配结果。
使用:copen
命令打开的Quickfix,是全局性的。而使用:lopen
打开的Location List,则是独立存在于各个窗口中的。
对于Quickfix,使用:cp
命令,跳转到上一个匹配处;使用:cn
命令,跳转到下一个匹配处。
对于Location List,使用:lpre
命令,跳转到上一个匹配处;使用:lnext
命令,跳转到下一个匹配处。
使用以下命令,可以在当前目录下查找指定字符串:
:vimgrep grep *
如果希望在当前目录及其子目录中进行查找,那么可以使用**通配符:
:vimgrep blue **
以下命令将在当前目录及其子目录中的所有HTML文件中,查找指定字符串:
:vim blue **/*.html
请注意,:vimgrep命令可以缩写为:vim
。
首先在常规模式下,使用*
命令查找光标下的单词;然后使用以下命令,可以重用之前的查找:
:vim // *.html
默认情况下,将自动跳转至第一个匹配处;如果希望停留在当前位置,那么可以在命令中使用j参选:
:vimgrep /foo/j **/*.md
使用以下命令,可以查看更多帮助信息:
:help :vimgrep
使用以下命令,将在当前目录下查找所有文件:
:grep block *.*
默认情况下,grep是区分大小写的,可以使用-i选项来忽略大小写:
:grep -i word filename
使用-o选项,将只显示匹配的字符,而不是整行内容:
:grep -o [[:punct:]] filename
使用以下命令,可以查看更多帮助信息:
:help :grep
请注意,递归搜索子目录的 **/*.* 通配符,对于Linux下的:vimgrep和:grep命令有效;但对于Windows下的:grep命令不起作用。
使用以下命令,可以查看'grepprg'选项的当前设置:
:set grepprg?
在不同的操作系统下,Vim将默认使用不同的外部grep工具:
grepprg=findstr /n
grepprg=grep -n $* /dev/null
如果希望默认查询当前目录以及其子目录,那么可以使用以下设置:
set grepprg=findstr /S /n
set grepprg=grep -nR $* /dev/null
请注意,您可以使用:pwd
命令来查看当前目录。
如果您在Windows中已经安装了Git或Cygwin,那么只需要在环境变量PATH中增加相应目录,即可调用其自带的grep命令:
在Windows命令行中,可以使用以下命令进行验证:
$ grep --version
然后在vimrc配置文件中,使用以下设置:
set grepprg=grep\ -rnIH\ --exclude-dir=.git
通过以上设置,可以在Windows环境中使用Linux风格的grep程序。
使用以下命令,可以查看更多帮助信息:
:help 'grepprg'
:help pattern
关于正则表达式的更多信息,可以参考以下网站:
使用以下网站,可以视觉化正则表达式,以便分步理解复杂的表达式: