如何删除模式不存在的所有段落?

时间:2013-08-29 09:40:47

标签: vim

我记录了参加会议的日志。

每次会议:

  • 由空行分隔( - >每个会议是段落)
  • 由于表达式,
  • 被折叠
  • 包含带有相应标签的行:ACME,GMBH,SARL等......

当我想要审查我所有的会议时,例如ACME,

  • 我创建了一个临时缓冲区(:%y,然后是:tabnew,然后是粘贴)
  • 我希望消除ACME没有想到的所有段落。

这是我遇到问题的地方。

我知道如何按行搜索/删除:

:v/ACME/d

但是我该如何逐段完成(以便将整个段落保留在ACME数据中,而不是唯一的标记行)?

注意:ACME模式可以在这些段落中多次出现。

2 个答案:

答案 0 :(得分:7)

这有效:

let @r="" | execute("g/acme/ normal \"Rdap") | %d | put r

它会转到包含“acme”的每个段落,并将其追加删除到注册r。然后删除所有内容并放入寄存器r。

如您所见,基本技巧是使用大写字母寄存器添加到其中,而不是替换其内容。这也需要在开始时重置寄存器,以丢弃先前的寄存器内容。

这适用于多次出现“acme”的段落,因为整个段落在第一次匹配后被删除,因此,它不会再次匹配。

答案 1 :(得分:3)

我会用awk来做,你可以用vim:

%!awk -v RS="" -v ORS="\n\n" '/ACME/' 

然后只保留包含ACME的段落。