2013-08-29 27 views
5

我保存了參加會議的日誌。如何刪除模式不存在的所有段落?

每個會議:

  • 由空行分隔( - >每次會議是一個段落)
  • 被摺疊由於表達式
  • 包含與對應的標籤的線:ACME, GMBH,SARL,等...

當我要讓所有會議我有,例如審查,ACME,

  • 我創建了一個暫存緩衝區(:%y,後面跟着:tabnew,然後粘貼)
  • 我希望消除ACME不計算在內的所有段落。

這是我遇到問題的地方。

我知道如何尋找/由行中刪除:

:v/ACME/d 

但是我怎麼做到這一點的第(以保持整個段落,其中ACME的數字,而不是標籤的唯一行)?

注意:模式ACME可以在這些段落中重複多次。

回答

6

這工作:

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

它轉到包含「極致」每一個段落,並刪除它追加登記河然後刪除所有內容並將寄存器r。

如您所見,基本技巧是使用大寫字母寄存器來添加它,而不是替換其內容。這也需要在開始時重置寄存器,以丟棄先前的寄存器內容。

這適用於多個出現「極致」的段落,因爲整個段落在第一次匹配後被刪除,所以它不會再次匹配。

+0

哇,真的很驚訝,執行'括號不會給出語法錯誤。我從來沒有見過這個,通常寫成「執行」...「。 – glts

+0

@glts同樣在這裏! ;)我甚至搜索':h execute()'來查看是否有函數..無論如何,這工作+1!如果在開始時保存'@ r'的值並在最後恢復它會更好。 – Kent

+1

@glts我試過echo(「foobar」)''echo(「foo」)。(「bar」)'也是。看來只要'()'之間的表達式返回一個有效的字符串(或者可以轉換成str),它就可以工作。 '(和)'增強了可讀性。 :) – Kent

3

我會awk完成這件事,在vim你可以:

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

則僅含有ACME段落將被保留。

+0

感謝您的回答,但是我的Android設備上沒有awk(僅在我的電腦上)。在Vim中是不可能的? – ThG

+0

@ThG這是肯定可能的,但它不會是幾個擊鍵作業... – Kent

+0

我曾嘗試:v /'{ACME'}/d ...並刪除了一切(我仍然不明白爲什麼) 。再次感謝。 – ThG