vim学习实践开源工具技巧程序员

Vim常用匹配、查找、替换命令总结

2017-10-21  本文已影响316人  Chuck_Hu

今天这篇是整个Vim专题的最后一篇,想看之前的篇目可以进专题详细阅读。

按模式匹配及按原义匹配

①设置全局大小写敏感

Vim支持全局性的设置大小写敏感,也支持在每次查找时进行局部调整。
如果启用 'ignorecase' 则Vim将不再区分大小写。当然也有与之相对应的 'smartcase' 选项,当 'smartcase' 被设置时,只要输入有大写字母,即使设置过 'ignorecase' 选项也将不再生效。
也就是说, 'smartcase' 选项在无大写字母的情况下是忽略大小写的匹配,一旦有大写字母,则转为大小写敏感型匹配。

: set ignorecase    忽略大小写
: set smartcase     强制大小写敏感,可覆盖ignorecase
②每次查找时设置大小写敏感

可以使用元字符 '\c' 和 '\C' 来覆盖Vim的大小写敏感设置。'\c' 指定匹配时忽略大小写,而 '\C' 则在匹配时强制区分大小写。注意: '\c' 和 '\C' 使用时自动忽略 'ignorecase' 选项
当上述元字符与①中提到的两个选项使用汇总:

模式        'ignoerecase'        'smartcase'        匹配
foo              off                  -             foo
foo              on                   -             foo Foo FOO等
foo              on                   on            foo Foo FOO等
Foo              on                   on            Foo
Foo              on                   off           foo Foo FOO等
\cfoo            -                    -             foo Foo FOO等
foo\C            -                    -             foo
③按正则表达式查找

按正则表达式匹配需要通过 '\v' 命令开启。该元字符将激活very magic搜索模式,即假定除数字0~9,大小写字母及下划线之外的所有字符都具有特殊含义。
有当前文本

原文本

搜索十六进制颜色代码,使用正则表达式:/#([0-9a-fA-F]{6}|[0-9a-fA-F]{3}),进行正则匹配

正则匹配 效果
④按原义匹配

正则表达式的特殊字符在按模式查找时很顺手,但如果希望按照原义查询文本时,会有阻碍。 '\V' 将会使Vim按照原义进行查找。例如,现在有文本

原文本

查询文本 "c.l.r",正常情况下通过 '/c.l.r' 的效果

匹配子串被当作正则表达式

使用 '\V' 进行原义匹配

输入原义匹配命令 原义匹配
⑤界定单词的边界

经常遇到这种情况,如果文本中含有 'the'、'these' 等单词,通过 '/the' 命令进行匹配时,会将所有含有 'the' 的单词的相应部分高亮显示。如果我们只是想单纯的匹配单词 'the' 可以使用在very magic模式下使用 '<>' 对单词进行定界。


'/the'匹配效果

使用very magic + <>定界


'/\v<the>'
⑥转义问题字符
'\V' 可以转义 '+'、'.'、'*'等字符的特殊含义,但仍有一些字符的特殊含义无法被屏蔽掉

(1)正向查找转义 / 字符

原文本
对原文本,现在希望找到所有出现 'http://viexe.com/search?q=/\' 的地方,如果使用 '\V' 开启原义匹配。 '\V'原义匹配 效果
会发现Vim实则按照 '/\Vhttp' 进行匹配,原因是其将第一次出现的 '/'解析成了结束符号。
正向查找时,需要将每个 '/' 前添加一个 '' 进行转义。将命令改为 '/\Vhttp://viexe.com/search?q=/\'即可完成查找 '/\Vhttp://viexe.com/search?q=/\'匹配

(2)反向查找转义 ?
执行反向查找时, '?' 会被当作查找域的结束符。反向查找不必对 '/' 进行转义。

'?' 被作为结束符
需要在 '?' 前使用 '' 进行转义,将匹配命令变为'?http://viexe.com/search?q=/\' '?http://viexe.com/search?q=/\'
(3)每次都要转义
细心的朋友发现(1)、(2)中改变匹配方式后,匹配项最后都会缺少一个 ''。因为 '\' 中第一个 '' 也会被当作转义字符,将第二个 '' 转为普通文本,相当于一个 '',因此需要对两个 ''都进行转义,只需要变为 '\\' 即可。有点不好理解,但确实能达到效果。 转义'' 完成

查找总结

每次查找操作通过 '/' 或者 '?' 命令开启,输入匹配项之后敲击回车键进入查找模式,<Esc>键退出。

①查找的方向

查找的方向可以是正向查找和反向查找,正向查找通过 '/' ,反向通过 '?' 。
重复上一次查找,通过 'n' 跳到下一处匹配, 'N' 跳到上一处匹配。注意这里的上一处和下一处是与查找方向相对应的。如果是正向查找,下一处指文本阅读顺序的下一处。反向查找的下一处,即是文本倒序的下一处。
方向命令汇总:

n    跳转到下一处,保持方向和偏移不变
N    跳转到上一处,保持方向和偏移不变
/    跳转到 '/' 模式下的下一项匹配
?    跳转到 '?' 模式下的下一项匹配

②将光标移到匹配项的结尾
之前的匹配无论是 '/' 还是 '?' ,都会将光标移到单词的开头,如果希望光标锁定单词的结尾,可以通过添加 'e' 命令。
例如对原文本进行 "the" 的匹配查询

原文本 '/the'光标在单词开头 '/the/e'光标在单词结尾

替换命令汇总

①认识substitute命令
':substitue'命令除了要提供查找的模式和替换的字符串之外,还要指定执行的范围。可以指定标志位调整命令的行为,这一项是可选项。
'substitue' 最常用的方式是先查找一段文本再将其替换掉。命令语法:

:[range] s[ubstitute] /{pattner}/{string}/[flags]

{string}是替换域,其中包含一些特殊字符

\r      换行符
\t      制表符
\\      一个反斜杠
&      匹配模式的所有内容
~      上次使用subsitute时的{string}

[flags]是标志位,常见标志位有

g      指定全局执行
c      有机会确认每次修改,每处匹配项替换时会确认,'y'为确认替换,'n'反之
n      会抑制每次替换,只返回substitue的匹配个数
&     用于使用上次substitue使用的标志位

②文件范围内查找并替换每一处匹配
使用命令

:%s/{pattner}/{string}/g

'/g'看上去是global的意思,实则只代表当前一整行的范围。'%'的意思是处理纵轴的行,与'/g'结合便可以处理全文。没有'%'则命令只能替换当前行的所有匹配项。
③手动控制每一次替换操作
需要使用到①中的'/c'标志位。

原文本

现在手动控制替换文本中所有hello为hi。

'/g'和'/c'配合使用 替换前确认 'y'完成替换

对于每次手动操作,会有几个选项,每个选项的含义

y      替换此处匹配
n      忽略此处匹配
q      退出替换过程
l      "last"——替换此处后退出
a      "all"——替换此处之后所有的匹配
Ctrl + e      向上滚动屏幕
Ctrl + y      向下滚动屏幕

④重复上一次substitue命令
加入通过命令':s/hello/hi/g' 将当前行的hello替换为hi,之后希望通过相同的操作替换文本所有的hello,除了使用命令 ':%s/hello/hi/g' 之外还可以通过一下方式完成

'%s//~/&'完成所有替换 替换结果

其中 '~' 和 '&' 之前都有提到,分别表示之前的替换域和标志位。其实还有更简洁的方式,就是通过 'g&' 命令完成全局的替换。

上一篇 下一篇

猜你喜欢

热点阅读