Vim之将匹配行写入到新文本

本文转载自:

http://hi.baidu.com/asnahu/blog/item/1d2beb54103d8f53d10906e2.html


题注:本文是Vim的奇技淫巧,出自http://blog.chinaunix.net/u/8681/showart_2106555.html。该博作者是Vim的大牛,翻译了Vim帮助文档。在这里对作者的无私付出表示感谢!

既然是转载就不想说太多了,以下是原文:

--------------------------------------------------------------------------------------------------------------
1. 将文本重定向到文本

        :redir > ./all_matches.txt
        :silent g/regex/
        :redir END

现在all_matches.txt 中就是符合正则表达式的行了, 略有遗憾的是, 前面会有两个空行, 不过你很可能并不在意。

2. 利用寄存器先收集, 再保存

        :let @a=""
        :g/regex/y A
        :new

打开一个新缓冲区, 然后执行

        "ap

把寄存器里的内容全部贴到该缓冲区中, 接下来就简单了, 保存到文件即可.

3. 如果你当前打开的缓冲区有对应的文件, 这其实是一个简单的命令行问题. grep regex file > match.txt 即可

不过办法3在几种情况可能并不方便:
A) 如果你当前的文件很大, 并且有一些内容尚未存盘, 你可能并不想因为这个而必需存盘一次
B) 还有可能你的当前缓冲区并不存在一个对应的文件. 为使用这个方法你还是得先保存一次
C) vim的正则表达式有一些特别的扩展, 可能是你见到的其它工具都不具备的, 比如variable length look behind assertion, 包括perl(但perl 6已经支持), 如果你碰巧需要用到这部分的正则表达式特性, 其它的工具提供不了给你(即使你用grep -P). 不过这种情况下, 你应该自有办法, 不需要看我在这唠叨。

或许你跟我一样, 尝试过 :g/regex/w match.txt
但它不工作, 它并不是把所有符合条件的行收集到文件中, 而是对每一个符合条件的行, 都执行命令

        w match.txt

结果就是有N次, 执行这么同一个存盘的动作。 而且, 保存的是缓冲区中全部的行,非你所愿。
--------------------------------------------------------------------------------------------------------------

第一种方法会将行数也一起添加到新文本,所以需要稍微处理一下。个人比较认同第二种方法。


本文转载自:

http://hi.baidu.com/asnahu/blog/item/1d2beb54103d8f53d10906e2.html


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值