删除与模式不匹配的日志块(多行)

时间:2014-07-14 13:39:36

标签: regex vim

如何删除与特定模式不匹配的信息块,说明:

[received]
   some_text
   ...
   MYPATTERN
   some_other_text

[received]
   some_text
   ...
   IGNORED_MESSAGE
   some_other_text

[sent]
   some_text
   ...
   ALSO_IGNORE_THIS_ONE
   some_other_text

[sent]
   some_text
   ...
   MYPATTERN
   some_other_text

如何使用:s:g仅保留包裹,阻止信息与MYPATTERN,具体结果如下:

[received]
   some_text
   ...
   MYPATTERN
   some_other_text

[sent]
   some_text
   ...
   MYPATTERN
   some_other_text

如果单个命令太复杂,可以建议使用函数。

2 个答案:

答案 0 :(得分:4)

  1. 清空一个寄存器,比如注册h

    qhq
    
  2. 将所有匹配的块切割为寄存器h

    :g/MYPATTERN/normal "Hdap
    
  3. 删除整个缓冲区:

    :%d
    
  4. 放置注册h的内容:

    :put h
    

答案 1 :(得分:2)

%s/\v\[((MYPATTERN)@!\_.){-}\n\s*\n//

正则表达式解释:

  • \[以匹配每个段落的开头
  • \_.匹配任何字符,包括行尾
  • {-}匹配0次或更多次,类似于*但非贪婪(尽可能少)
  • ((MYPATTERN)@!\_.){-} - MYPATTERN之前没有任意数量的字符 - 有关详细信息,请参阅:help \@!
  • \n\s*\n匹配一个空行,标记段落的结尾