天天看点

vim 全局命令 g(global)命令格式介绍参考示例

文章目录

  • 命令格式介绍
  • 参考示例
    • 范围匹配
    • 删除匹配的行
    • 删除不匹配的行
    • 删除大量匹配行
    • 移动匹配的行
    • 复制匹配的行
    • 复制到 register a
    • 反转文件中的每一行
    • 在匹配行后添加文字

命令格式介绍

全局命令

g

在 Vim 的底行命令模式下有着意想不到强大的功能。当想要在整个文件中对于匹配的行或者非匹配行进行一些操作时,应该第一时间想到这个

g

命令

global

可以简写为

g

  1. [range]

    指定文本范围,默认为整个文档
  2. pattern

    在范围

    range

    内的行如果匹配

    pattern

    ,则执行

    command

  3. !

    表示取反,也就是不匹配的行,也可以使用

    vglobal

  4. 如果不写

    g

    ,则会对整个文档执行命令
  5. 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