vim查找替换技巧

前端之家收集整理的这篇文章主要介绍了vim查找替换技巧前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

查找

查找命令

命令 用途
n 跳至下一处匹配,保持查找方向与偏移不变
N 跳至上一处匹配,保持查找方向与偏移不变
/ 正向跳转至相同模式的下一处匹配
? 反向跳转至相同模式的上一处匹配

查找历史
vim 会一直记录我们执行过的查找模式,因此可以方便地重用它们。当查找提示符出现时使用”向上方向键”浏览之前的查找记录
高亮查找匹配
查找命令允许我们在诸多匹配中快速跳转,但在缺省情况下,Vim 不会将这些匹配可视化地凸现出来。我们可以通过设置高亮来解决此问题(:h hlsearch)
设置和关闭方式:

:set nohlsearch/hlsearch

在执行查找前预览第一处匹配
缺省情况下,我们在输入查找模式时,Vim 不会进行查找,只有当我们按下 后,它才会立即展开行动。‘incsearch’可以执行前预览第一处匹配
设置和关闭方式:

:set noincsearch/incsearch

统计当前模式的匹配个数

%s///gn

substitute 命令,但标志位n 会抑制正常的替换动作。该命令不会对每处匹配进行替换,而是简单地统计匹配的次数,并将结果显示到命令行上。此处我们将查找域留空,旨在让Vim 使用当前的查找模式。替换域(由于标志位n 的缘故)不管怎样都将会被忽略,因此也可以将其留空
快速查找当前光标位置keyword
*:在普通模式下,* 命令让我们可以查找光标下的单词

替换

格式:

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

range 的规则对于每一条Ex命令都适用,substitute 命令也不例外
:substitute 命令很复杂,除了要提供查找的模式以及替换字符串外,还要指定执行的范围。另外,作为可选项,我们还可以通过标志位来调整该命令的行为(:h s_flags):

标志位 作用
g 使得subsititute 命令可在全局范围内执行,即可以修改一行内的所有匹配,而不仅仅是第一处匹配。
c 让我们有机会可以确认或拒绝每一处修改
n 会抑制正常的替换行为,即让 Vim 不执行替换操作,而只是报告本次substitute 命令匹配的个数。
e 用于屏蔽错误信息。如当我们执行 substitute 命令时,如果在当前文件中没有匹配到该模式,Vim 会提示错误信息“E486: 找不到模式”。
& 仅仅用于指示Vim 重用上一次substitute 命令所用过的标志位。

替换域中的特殊字符
查找完整的特殊字符列表

:h sub-replace-special

贴一副图片上来(偷个懒太多了,文字还得排版)

手工控制每一处替换
引入c标志位即可,每次替换都询问,y替换当前匹配,n跳过当前匹配。
所有回应提示如下表(:h :s_c):

答案 用途
y 替换此处匹配
n 忽略此处匹配
q 退出替换过程
l “last” —— 替换此处匹配后退出
a “all” —— 替换此处与之后所有的匹配
<C-e> 向上滚动屏幕
<C-y> 向下滚动屏幕

重用上次的查找模式
将substitute 命令的查找域留空,意味着Vim 将会重用上次的查找模式。
*注意*
把查找域留空,会在命令历史中留下一项不完整的记录。由于模式通常保存在Vim 的查找历史记录中,而substitute 命令则保存于Ex 命令的历史记录中(参见:h cmdline-history )。因此,将查找任务与替换任务分离,会致使这两组信息被单独存放,从而导致当你再想重用之前的substitute 命令时,会遇到困难
用寄存器的内容替换
实际上,我们不必手动输入完整的替换字符串。如果某段文本已在当前文档中出现,我们可以先把它复制到寄存器,再通过传值或引用的方式将寄存器的内容应用至替换域。
另种方式(以复制专用寄存器(”0)为例):
1)传值
通过输入<C-r>{register},我们可以将寄存器的内容插入到命令行.
执行yy赋值命令使得寄存器0中有值或者执行命令:let @0=’test’

vim test.sh
/a
:let @0='test'
:%s//<C-r>0/g  实际效果:%s//test/g

Vim 会把寄存器0 的内容粘贴进来,这意味着我们可以在执行substitute 命令之前对其进行一番检查
*注意*如果寄存器0 中的文本包含了在替换域中具有特殊含义的字符(例如& 或~),我们必须手动编辑这段文本,对这些字符进行转义。另外,如果寄存器0 包含多行文本,有可能在命令行上显示不全。
2)引用
执行yy赋值命令使得寄存器0中有值或者执行命令:let @0=’test’

vim test.sh
/a
:let @0='test'
:%s//\=@0/g

替换域中出现的\= 将指示 Vim 执行一段表达式脚本。在Vim 脚本中,我们可以用@{register} 来引用某个寄存器的内容
*注意* 这里用到了:let @{register}=’xxxxx’

未完待续……

猜你在找的Bash相关文章