文章目录
- 命令格式介绍
- 参考示例
-
- 范围匹配
- 删除匹配的行
- 删除不匹配的行
- 删除大量匹配行
- 移动匹配的行
- 复制匹配的行
- 复制到 register a
- 反转文件中的每一行
- 在匹配行后添加文字
命令格式介绍
全局命令
g
在 Vim 的底行命令模式下有着意想不到强大的功能。当想要在整个文件中对于匹配的行或者非匹配行进行一些操作时,应该第一时间想到这个
g
命令
global
可以简写为
g
。
-
指定文本范围,默认为整个文档[range]
-
在范围pattern
内的行如果匹配range
,则执行pattern
command
-
表示取反,也就是不匹配的行,也可以使用!
vglobal
- 如果不写
,则会对整个文档执行命令g
-
默认是打印文本command
整个命令可以理解成,在
range
范围内匹配 pattern 的行执行
command
;可以通过在“底行命令模式”下输入
help ex-cmd
来查看所有的
command
。
常用的
command
:
- d 删除
- m 移动
- t 拷贝
- s 替换
参考示例
范围匹配
比如在20行到200行之间,每一行下插入空行
20,200g/^/pu _
我知道
p
是粘贴,
u
是撤销,完全不懂
pu _
是什么鬼?谁知道的麻烦留言告诉我下,谢谢!
删除匹配的行
删除与pattern匹配的行
g/pattern/d
删除空白行
g/^$/d
删除不匹配的行
g!/pattern/d
v/pattern/d
vglobal/pattern/d // 没有验证过,不知道行不行
inverse/pattern/d // 没有验证过,不知道行不行
删除大量匹配行
Vim 在删除操作时,会先把要删除的内容放到寄存器中,假如没有指定寄存器,会默认放到一个未命名的寄存器中,对于要删除大量匹配行的行为,可能导致 Vim 花一些时间处理这些拷贝,避免花费不必要的时间可以指定一个 blackhole 寄存器
_
g/pattern/d_
移动匹配的行
将所有匹配的行移动到文件的末尾
g/pattern/m$
复制匹配的行
将所有匹配的行复制到文件末尾
g/pattern/t$
复制到 register a
Vim每个字母都是一个寄存器,所以使用全局命令也可以将内容复制到某一个寄存器,比如
a
。
先在普通命令模式下输入:
qaq
,清空寄存器 a。
qaq
qaq
清空寄存器
a
,
qa
开始记录命令到
a
寄存器,
q
停止记录。
然后在底行命令模式下输入以下的命令:
g/pattern/y A
y
表示复制,大写英文字母
A
表示把内容追加到寄存器
a
中,所以大写字母
A
包含两层含义,其一是指寄存器
a
;其二是指
append
。所以
y A
表示将匹配到的内容复制到寄存器
a
中。如果使用小写的
a
,则会覆盖寄存器
a
原有的内容。
存放到
a
寄存器之后就可以使用命令
"ap
来粘贴使用,其中
"a
表示寄存器
a
,
p
表示粘贴。
反转文件中的每一行
g/^/m0
解释:
^
表示行首,每行都有行首,所以相当于匹配到所有的行;
m
表示移动;
表示文档第
1
行的上方。匹配过程是这样的,先匹配到文档的第
1
行,然后移到文档的最上方;接着匹配到第
2
行,也移动到文档的最上方,此时文档的最上方就是第
1
行文本的上方;后面就依照这样的堆叠顺序一行行往上放,最后所有的行就被倒过来了。
在匹配行后添加文字
使用替换命令
s
在每行末尾插入字符串
mytext
。
%s/$/mytext
同样使用全局 g 命令也可以实现同样的效果,很显然全局 g 命令把问题复杂化了。
g/pattern/s/$/mytext
g/pattern/
匹配到需要在行尾插入字符串的行,再结合替换命令
s
将行尾替换成
mytext
,即在行尾插入
mytext