首页 > 贝壳 > vim匹配不含某个字符串的行

vim匹配不含某个字符串的行

2011年11月25日 sigma 发表评论 阅读评论

今天处理一个log文件,需要删除不含某个字符串的行。但我不想用sed,awk或者python,想在vim中解决。查了下help,发现有个@!的模式。

具体详见帮助内容(我从网上找了个中文的摘录到此):

@! 零宽度否匹配,亦即,要求前面的匹配原在当前位置_不_匹配。

|/zero-width| {Vi 无此功能}

类似于 Perl 中的 ‘(?!pattern)”。

示例 匹配 ~

foo(bar)@! 任意后面不带 “bar” 的 “foo”

a.{-}p@! “a”,”ap”,”app” 等。后面不带 “p”

if ((then)@!.)*$ “if ” 后面无跟随 “then”

使用 “@!” 要小心,因为很多地方一个模式可以不匹配。”a.*p@!” 会匹配一

个 “a” 直到行尾,因为 “.*” 匹配所有行内的字符,而 “p” 不在行尾匹配。

“a.{-}p@!” 则可以匹配 “a”,”ap”,”aap” 等中的一项,只要它们不再紧跟

另外一个 “p”,这是因为 “.” 可以匹配 “p” 而 “p@!” 不匹配这个 “p” 的后

面。

你不能用 “@!” 去寻找匹配所在位置之前的否匹配。”(foo)@!bar” 会匹配

“foobar” 中的 “bar”,因为在 “bar” 匹配的位置上,”foo” 并不匹配。如果

不想匹配 “foobar”,你可以尝试 “(foo)@!…bar”,但它不能匹配在行首出

现的 “bar”。最好的方法是用 “(foo)@<!bar”。

需要匹配不含某字符串的行的话,只需要:

/^(.*keyword)@!.*$

 

 

本文作者: Sigma    在新浪微博关注SigmaSigmaWeibo    RSS订阅本博客
本文链接: http://mblog.sigma.me/2011/11/25/vim-dismatch-line.html
本博客采用知识共享署名—非商业性-禁止演绎使用3.0协议进行许可,转载请保留作者和原文链接。

分类: 贝壳 标签: , ,

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.

无觅相关文章插件,快速提升流量