神级编辑器 Vim 使用-正则替换篇
Vim 的替换查找是其核心功能, 功能极其强大, 通过其规则匹配, 可以很快速地完成我们很多需要大量人力操作的工作, 而且可对多文件使用查找/替换功能.
本系列教程共分为以下五个部分:
神级编辑器 Vim 使用-基础篇
神级编辑器 Vim 使用-操作篇
神级编辑器 Vim 使用-插件篇
神级编辑器 Vim 使用-正则操作篇
神级编辑器 Vim 使用-最后
正则匹配的模式
编程界实现了多种正则匹配引擎, vim 的正则匹配引擎是独有的, 其风格类似于 POSIX
, 但是我们可通过将其匹配模式设为:
\v
: (very magic) 来开启Perl
模式, 此模式下(
已经被转义, 如果要搜索(
, 必须转回原义,\(
\V
: (very nomagic) 来开启开启原义模式, 此模式下直接搜索(
即可搜索到(
\m
: 默认模式, 不指定任何模式时使用的就是此模式. 此模式下仅部分字符有特殊含义,(
没有被转义, 仍然可通过(
搜索到(
\M
: (nomagic) 其功能类似于\V
原义开关, 不同的是, 一些字符会自动具有特殊含义, 即符号^
与$
本文只讨论默认模式下(\m
模式)下的正则匹配, 其他模式下的原理类似, 读者可自行研究
查找
查找元字符
元字符是正则匹配的一个概念, 通过元字符可以快速找出目标字段.
.
: 表示匹配任意 一个 字符. 例:c..l
表示任意以 c 开头, 中间有两个任意字符, l 结尾的字段.
.*
: 表示匹配 任意多个 字符. 例:c.*l
表示任意以 c 开头 l 结尾的字段(不会将一个字段进行跨行处理, 因此非常智能, 很频繁使用)
$
: 匹配行尾. 例:/d.*$
表示匹配到以 d 开头到行尾中的所有内容,/123$
表示以 123 结尾的所有字段
^
: 匹配行首. 例:^.*d
表示匹配到行首到 d 的所有内容,/^123
表示以 123 开头的字段
\<
: 匹配单词词首
\>
: 匹配单词词尾. 例:/\<f\>
表示只匹配f
单词, 如果其前有任何字符它就不是单词, 不会被匹配到.
*
: 表示其前字符可以重复 0~无数 次. 如/be*
会匹配到b
,be
,bee
..., 因为 e 重复零次就是没有, 所以会返回 b, 贪婪匹配模式, greedy
\+
: 表示其前字符必须重复 1~无数 次, 如/be\+
会匹配到be
,bee
,beee
..., 贪婪匹配模式
\(-)
: 0 或多个, 非贪婪匹配模式, non-greedy, 与*
相对
\?
或\=
: 代表其前字符必须重复 0 或者 1 次.
\{n,m}
: 其前字符必须重复 n 到 m 次, 贪婪匹配模式
\{-n,m}
: 其前字符必须重复 n 到 m 次, 非贪婪匹配模式
[adz]
: 匹配a
,d
,z
中的任意 一个, 括号内也可是数字, 如[2-5]
表示匹配2
,3
,4
,5
中的任意一个数字
\|
; 或的意思, 表示只要符合其前或其后任意一个字符即可. 例:/one\|two\|three
表示匹配 one, two, three 中的任意一个.end\(if\|while\|for\)
表示会查找到 endif, endwhile, endfor 中的任意一个.
[^a]
: 匹配除a
以外的任意 字符
[a-c]
: 匹配a
,b
,c
中的任意一个, 递增的顺序
\d
: 匹配十进制数字中的任意一个, 等同于[0-9]
. 例:/\d\d:\d\d:\d\d
表示查找如17:31:00
格式的字符
\D
: 匹配除十进制数字外的任意一个字符, 等同于[^0-9]
\x
: 匹配十六进制数字中的任意一个, 等同于[0-9A-Fa-f]
\X
: 匹配除十六进制数字外的任意一个字符, 等同于[^0-9A-Fa-f]
\w
: 匹配一个单词(对中文来说非常鸡肋, 因为只有 Vim 判定是单词的才会进行匹配, 与normal 模式下的w
,b
,e
匹配规则相同)
\W
: 匹配除单词外的所有字符. 因为在 vim 中中文全部不被认为是单词, 因此, 此匹配会选中所有中文字段.
\t
: 代表 tab , 可使用此方法将所有 tab 替换为空格
\s
: 配空白字段, 包含 tab 与空格, 在 pattern 中使用此查找空白, 在 string 中就可以直接使用空格或者 tab 来输入以替换了
\S
: 匹配非空白字段, 等同于[^\s]
\n
: 匹配换行符
\_s
: 匹配换行或空白
\_a
: 匹配换行或单词(因为是单词, vim 不会匹配中文)
\C
: 区分大小写地查找或替换, 例:/\CText
表示只会查找Text
, 不会查找text
或tExt
等
\c
: 不区分大小写地查找替换(已经在 vim 中设置了默认不区分了)
如上所述, .
, *
, [
, ]
, ^
, %
, /
, ?
, ~
, $
这十个字符有特殊含义, 如果对这十个字符进行匹配, 需要添加 \
查找时的常用操作
:noh
: 取消查找模式的高亮匹配
*
: 全文查找当前光标处单词 (n 为向下方向)
#
: 全文查找当前光标处单词 (n 为向上方向)
n
: 下一个列出的关键字
N
: 上一个列出的关键字
gn
: 进入面向字符的可视模式, 并选中下一项匹配
gN
: 进入面向字符的可视模式, 并选中上一项匹配
gUgn
: 使下一处匹配改为大写
<C-r><C-w>
: 根据当前查找模式下已经输入的内容结合全文进行自动补全
/<UP>
: 直接调用上次的查找逻辑.
/<DOWN>
: 直接调用下次的查找逻辑.
/<C-N>
: 直接调用下次的查找逻辑.
/<C-P>
: 直接调用上次的查找逻辑.
/<C-r>/
: 使用寄存器/
将上次查找的值直接插入到当前模式中来
查找逻辑
/pattern/[e]
查找实例
/view
: 全文查找 view 关键字 (n 为向下方向)
?view
: 全文查找 view 关键字 (n 为向上方向)
/\cview
: 全文查找 view 关键字(大小写不敏感)
/view/e
: 默认的查找会将光标置于单词首部, 使用e
保证光标位于尾部, 方便.
命令的调用
//e
: 匹配pattern
为空则直接重用上次的逻辑进行查找
/\<f\>
: 使用<
与>
限定词首与词尾, 保证只查找单词f
/^\n\{3}
: 查找三个空行
还有一种是使用 global
命令: :g/pattern/d
, 含义是对 patter 进行匹配搜索, 然后执行命令 delete
, 也是基于查找的
替换
替换元字符
\r
: 换行, 在 pattern 中使用\n
作为搜索串, 在string 中使用\r
作为换行命令(如果在 string 中仍然使用 \n 的话会出错)
\u
或\l
: 把替换串中的下一个字符分别变成大写或者小写.
~
: 用在替换串中, 代表使用上次的替换串.
&
: 用在替换串, 它代表与搜索模式想匹配的整个文本, 即“重现”搜索串. 这在试图避免重复输入文本时很有用.
\U
和\L
: 将跟在后面的匹配串全部变成大写或小写
替换逻辑
[range]s/pattern/string/[c,e,g,i]
range
: 范围,1,7
指第一行至第七行. 也可以使用%
代表当前的文章(也可以理解为全部的行),#
代表前一次编辑的文章(基本不用)
s
: 代表当前的模式为替换
/
: 作为分隔符, 如果确实要替换文中的/
, 那么可以使用#
代替作为分隔符. 例如:s#vi/#vim#g
, 代表替换vi/
为vim
pattern
: 要被替换掉的字符
string
: 将要使用的字符
c
: confirm, 每次替换前会询问
e
: ignore, 忽略错误(默认找不到会提示pattern not found
, 但是如果设置 vim 设置批量替换命令的话某一个项未匹配到不能影响到下一项的执行, 可以使用此关键字,:silent %s/x/y/g
==:%s/x/y/ge
)
g
: global, 整行替换(基本上是必加的, 否则只会替换每一行的第一个符合字符)
i
: ignore, 不区分大小写
I
: 区分大小写
变量替换
在表达式中可以使用 \(
与 \)
将表达式括起来, 然后既可在后面使用 \1
\2
来依次访问由 \(
与 \)
包围起来的内容.
例: :s/\(\w\+\)\s\+\(\w\+\)/\2\t\1
表示将 data1 data2 修改为 data2 data1
替换实例
r
: 进入单字符替换模式
R
: 进入替换模式
&
: 重复上次的替换过程
:s/vi/vim/
: 只替换当前行的第一个 vi 为 vim
:s/vi/vim/g
: 替换当前行的所有 vi 为 vim
:%s/vi/vim/g
: 替换全文所有 vi 为 vim
:%s/vi/vim/gi
: 替换全文所有 vi 为 vim, 大小写不敏感
:n,$s/vi/vim/gci
: 替换从第 n 行到结尾所有 vi 为 vim, 每次替换提示, 不区分大小写
:.,$s/vi/vim/gci
: 替换从当前行到结尾所有 vi 为 vim, 每次替换提示, 不区分大小写
:.,+3s/^/#
: 在当前行到下面三行添加#
的注释
:g/^\s*$/d
: 删除所有空行
:215,237 s/\(.\)$/\1(自定义)/c
: 将 215 至 237 行尾部添加(自定义)
:%s/^\n$//gc/
: 替换多个空行为一个空行
:122,250s/\(201\d*\)\.\(\d*\)\.\(\d*\)\s/\1-\2-\3_/gc
: 替换2017.12.31
类型的字段为2017-12-31_
%s/\(\](http:.*com\/\)\(HK.*\))/\](https:\/\/a.hanleylee.com\/\2?x-oss-process=style\/WaMa)/gc
: 将[](http: ....com)
替换成 https 并且尾部带有样式参数
:%s/\(a.*bc\)\(<.*>\)\(xy.*z\)/\3\2\1/gc
: 使用缓冲块实现对前后区域匹配并翻转位置(需要时再理解)
:%s/hello/&, world/
: 将会把hello替换成hello, wolrd
:%s/.*/(&)/
: 将会把所有行用()包含起来
: s/world/\U&/
: 把 world 变成 WORLD
:%s ; /user1/tim;/home/time;g
: /user1/tim改为/home/time, 除了/字符外, 还可以使用除反斜杆, 双引号和竖直线\
,"
, 和|
, 之外的任何非字母表, 非空白字符作为分隔符, 在对路径名进行修改时, 这点尤其便利
:s
: 与:s//~/
相同, 重复上次替换
:&
: 重复上次替换
%s/\<child\>/children/g
: 保证在 child 是个完整单词的情况下进行替换
:g/mg[ira]box/s/box/square/g
: 将mgibox routine, mgrbox routine, mgabox routine,
中的 box 换为 square
&
: 直接使用 & 也是重复上次替换的意思
替换时系统会对用户进行询问, 有 (y/n/a/q/1/^E/^Y
)
y
: 表示同意当前替换
n
: 表示不同意当前 替换
a
: 表示替换当前和后面的并且不再确认
q
: 表示立即结束替换操作
1
: 表示把当前的替换后结束替换操作;
^E
: 向上滚屏
^Y
: 向下滚屏,
多文件查找与替换
多文件操作的基础是一定要 设置好工作目录, 因为添加文件到操作列表是以当前路径下的文件进行判断筛选的, 设置当前路径可使用以下方式:
手动 :cd path
NERDTree
插件的cd
命令
netrw
插件的cd
命令
在 .vimrc
中设置set autochair
自动切换当前工作路径
多文件查找
逻辑
vimgrep /pattern/[g][j] <range>
vimgrep
: 批量查找命令, 其后可直接加!
代表强制执行. 也可以使用lvimgrep
, 结果显示在 list 中
patten
: 需要查找的内容, 支持正则表达式, 高级用法见元字符
g
: 如果一行中有多个匹配是否全部列出
j
: 搜索完后直接定位到第一个匹配位置
range
: 搜索的文件范围%
: 在当前文件中查找
**/*.md
: 在当前目录即子目录下的所有 .md 文件中
*
: 当前目录下查找所有(不涉及子目录)
**
: 当前目录及子目录下所有
*.md
: 当前目录下所有.md 文件
**/*
: 只查找子目录
查找的结果使用 quick-fix
来进行展示, 可使用 :copen
查看所有结果项并进行相应跳转, 具体操作参考 神级编辑器 Vim 使用-操作篇
实例
:vimgrep /hello/g **
: 在当前目录及子目录下的所有文件内查找hello
字符串
quickfix-list 与 location-list 的区别
quickfix-list 是一个完整的窗口, 可以移动上下光标, 按下 enter 进行打开文件
location-list 只是一个局部的显示区域, 只能简单显示查找结果的信息, 目前看来没有必要使用此选项
多文件替换
多文件替换所依赖的是 vim 中的参数列表概念, 这里仅对流程命令进行演示, 具体的参数列表操作参考 神级编辑器 Vim 使用-操作篇
args
: 显示当前的所有参数列表
:args *.md aa/**/*.md
表示添加子文件夹下的md
文件及aa
文件夹下的和其子文件夹下的md
文件到参数列表中
:argdo %s/oldword/newword/egc | update
: 对所有存在参数列表中的文件执行命令,s
代表替换,%
指对所有行进行匹配,g
代表整行替换(必用),e
指使用正则表达式,c
代表每次替换前都会进行确认,update
表示对文件进行读写
:argdo %s/!\[.*\]/!\[img\]/gc
: 将所有参数列表中的以![
开头, 以]
结尾的所有字段改为[img]
:argdo write
: 将所有参数列表中的内容进行缓冲区保存
最后
本文作者 Hanley Lee, 首发于 闪耀旅途, 如果对本文比较认可, 欢迎 Follow
神级编辑器 Vim 使用-正则替换篇相关推荐
- 神级编辑器 Vim 使用-基础篇
最近一段时间, 看了两本关于 vim 的书, 重新学了一遍 vim, 在感慨 vim 强大的同时, 也为从前的自满感到汗颜, 我拿起了从前做的关于 vim 的笔记, 重新梳理了一遍, 作为一个系列分享 ...
- 神级编辑器 Vim 使用-插件篇
在这篇中, 会列举各种实用的插件, 包括他们的安装, 配置及使用方法 注意: 不是本部分的所有插件都是你需要装的, 如果盲目安装插件只会导致你 vim 功能混乱, 速度底下, 所以适时整理真正需要的插 ...
- 神级编辑器 Vim 的基本使用命令
功能 命令行模式下的文本编辑器 根据文件扩展名自动判别编程语言.支持代码缩进.代码高亮等 使用方式: vim filename 如果存在文件,则打开它 如果不存在该文件,就创建一个新的文件,并命名为f ...
- 统一了Excel和Python的神级编辑器GridStudio,安装起来确实不简单
点击上方SQL数据库开发,关注获取SQL视频教程 SQL专栏 SQL数据库基础知识汇总 SQL数据库高级知识汇总 昨天发了一篇关于神级编辑器Grid Studio的推文<>.它主要的功能就 ...
- Linux系列开坑记(二)-神的编辑器Vim
今天是Linux系列命令第二篇,今天我们来简单聊聊Vim这个号称是「编辑器之神」的编辑器---Vim 是Vi Imporved,vi来源visual单词,目的是在做可移动光标的视频编辑文本. 写这篇文 ...
- Sublime Text2,跨平台神级编辑器乱码问题解决
SubLime Text2是一个跨平台的源代码及文本编辑器,个人感觉可以称之为MAC平台上TextMate的跨平台版,界面.功能和快捷键都很舒服.唯一不足是对中文支持不好,打开含有中文字符的文件会乱码 ...
- vim表达式正则替换
例如想要把以下@{/...}的部分去掉@{/}保留...的部分 <script src="@{/jquery-3.3.1.min.js}"></script> ...
- 向Excel说再见,神级编辑器统一表格与Python
点击"开发者技术前线",选择"星标????" 13:21 在看|星标|留言, 真爱 来自:机器之心 参与:思源.张倩 很多开发者说自从有了 Python/P ...
- 这个神级编辑器给 Excel 加上了 Python 功能!
本文转自机器之心 很多开发者说自从有了 Python/Pandas,Excel 都不怎么用了,用它来处理与可视化表格非常快速. 但是这样还是有一大缺陷,操作不是可视化的表格,因此对技能要求更高一点. ...
最新文章
- 中国互联网+果汁行业商业模式创新与投资机会深度研究报告
- NHibernate 中删除数据的几种方法
- Centos 上部署jeecms注意1
- Android点击Button实现功能的几种方法总结
- Linux之解析鼠标input事件数据
- boost::process::std_in相关的测试程序
- sublime插件 TortioseSVN
- mysql select 反选_JQuery实现全选、全不选和反选功能
- 我对STL的一些看法(一)初步认识STL
- 小米这个系列绝了!7款之后再添新机,完全分不清
- 怎么看笔记本电脑的配置参数_想给笔记本电脑硬件配置升级,我应该怎么升?...
- ubuntu下搭建的lamp环境新建站点
- 金笛JDMAIL打造公务员邮件系统
- html单元格溢出,excel如何超出单元格显示
- 利用爬虫获得疫情信息,并存入表格
- 自己的作品界面---类似360杀毒软件的界面
- LTM(Lifelong Topic Modeling)介绍
- Pytroch 深度学习 跑CIFAR10数据集
- html添加视频背景
- 市面上几种常见的网络推广方式
热门文章
- 嵌入式Linux 系统移植流程总结
- excel怎么把竖排变成横排_Word2013竖排文字怎么排版
- linux脚本base64加密当时,用shell解密base64加密的文本的例子
- 磊科电脑怎么打开虚拟服务器,如何解决磊科无线路由器192.168.1.1打不开【教程图解】 | 192路由网...
- 浏览器缓存(强缓存和协商缓存)
- android两个数组对象去重合并,JS 两个对象数组合并并去重
- 诺基亚android one机型,诺基亚7 Plus曝光,搭载Android One+骁龙660
- awm怎么弄 rust_AWM绝地求生第八章(加更一)
- B站腾讯纷纷选择Steam发行 海外平台能成为端游厂商的救命稻草吗
- 计算机视觉技术在水果分级中的应用,计算机视觉技术在水果分级处理中的应用概况及发展...