Vim Global Command用法(g命令)

本文详细介绍了如何利用Vim编辑器的全局命令g,结合正则表达式,实现批量删除文本文件中指定字符串周围的行。通过实例演示了删除包含特定字符串的行及其前后行的方法,并探讨了更复杂的场景,如提取宏定义和处理不明确的条件分支。文章旨在提升开发者在文本处理任务中的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Task

删除一个文本文件中的所有带 ‘test’ 的行,以及这一行的前一行和后一行。
如何用Vim实现?

Solution

  • :g/test/-,/test/+ d

上面的命令是如何工作的呢?这你就需要了解vim的global命令(g命令)
:g就是global命令

语法:

  • :[range]g/pattern/cmd
  • :g/pattern1/, /pattern2/cmd

第一种语法会在range的范围内搜索pattern, 如果符合要求就执行cmd.
第二种语法会在/p1/, /p2/之间执行cmd

例:

  • :g/test/d
    删除所有带test的行
  • :g!/test/d
    保留带test的行
  • :g/hello/, /world/d
    删除所有hello, world之间的行

提取宏定义

有如下代码,现在要求提取出当TEST为Ture时,所定义的内容

#ifdef TEST
test1
test2
#else
no test
#endif

可以这样写g命令

:g/#ifdef TEST/+1, /#else\|#endif/-1 t $

+1代表取下一行,-1代表取上一行, #else|#endif表示满足#else或者#endif这两个条件都可以。
用以上的命令可以成功了取得#ifdef TEST所包含的内容

但如果我们想要取不满足#ifdef TEST的内容怎么办呢,这个问题要比上面的问题复杂。我们不能直接去搜索#else, 因为它之前有可能是其它的#ifdef, 而不是#ifdef TEST,其次,不是所有的#ifdef TEST都有#else定义。
所有我们要使用try和endtry命令

:try|g/#ifdef TEST//#else/+1, /#endif/-1 t $|endtry

解释一下,先找#ifdef TEST, 找到后再找#else, 然后取下一行,再找到#endif取上一行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值