VIM学习笔记 正则表达式-(vimgrep/grep)

在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)搜索工具:

:grep命令会运行由选项grepprg所指定的程序。在Linux系统上,grepprg默认是grep -n:

grep_linux

在Windows系统上,grepprg默认是findstr /n

findstr

:vimgrep命令使用vim内置的搜索引擎,与/命令功能一致,但速度相对较慢。

由此可见,使用:vimgrep命令在不同平台上将获得一致的体验。而:grep命令则是与操作系统相关的,在不同平台会有不同的行为。

:grep:vimgrep命令,都将在QuickFix中显示搜索结果。

:lgrep:lvimgrep命令实现相同的功能,但使用地址列表(Location List)来显示匹配结果。

使用:copen命令打开的Quickfix,是全局性的。而使用:lopen打开的Location List,则是独立存在于各个窗口中的。

对于Quickfix,使用:cp命令,跳转到上一个匹配处;使用:cn命令,跳转到下一个匹配处。

对于Location List,使用:lpre命令,跳转到上一个匹配处;使用:lnext命令,跳转到下一个匹配处。

:vimgrep

使用以下命令,可以在当前目录下查找指定字符串:

:vimgrep grep *

如果希望在当前目录及其子目录中进行查找,那么可以使用**通配符:

:vimgrep blue **

以下命令将在当前目录及其子目录中的所有HTML文件中,查找指定字符串:

:vim blue **/*.html

请注意,:vimgrep命令可以缩写为:vim

首先在常规模式下,使用*命令查找光标下的单词;然后使用以下命令,可以重用之前的查找:

:vim // *.html

默认情况下,将自动跳转至第一个匹配处;如果希望停留在当前位置,那么可以在命令中使用j参选:

:vimgrep /foo/j **/*.md

使用以下命令,可以查看更多帮助信息:

:help :vimgrep

:grep

使用以下命令,将在当前目录下查找所有文件:

:grep block *.*

默认情况下,grep是区分大小写的,可以使用-i选项来忽略大小写:

:grep -i word filename

使用-o选项,将只显示匹配的字符,而不是整行内容:

:grep -o [[:punct:]] filename

使用以下命令,可以查看更多帮助信息:

:help :grep

请注意,递归搜索子目录的 **/*.* 通配符,对于Linux下的:vimgrep和:grep命令有效;但对于Windows下的:grep命令不起作用。

'grepprg'选项

使用以下命令,可以查看'grepprg'选项的当前设置:

:set grepprg?

在不同的操作系统下,Vim将默认使用不同的外部grep工具:

如果希望默认查询当前目录以及其子目录,那么可以使用以下设置:

请注意,您可以使用:pwd命令来查看当前目录。

如果您在Windows中已经安装了GitCygwin,那么只需要在环境变量PATH中增加相应目录,即可调用其自带的grep命令:

在Windows命令行中,可以使用以下命令进行验证:

$ grep --version

grep_version_win

然后在vimrc配置文件中,使用以下设置:

set grepprg=grep\ -rnIH\ --exclude-dir=.git

通过以上设置,可以在Windows环境中使用Linux风格的grep程序。

帮助信息

使用以下命令,可以查看更多帮助信息:

:help 'grepprg'

:help pattern

关于正则表达式的更多信息,可以参考以下网站:

使用以下网站,可以视觉化正则表达式,以便分步理解复杂的表达式:

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>