2012-04-09 34 views
1

過濾多行文本塊以#tags結尾的正確正則表達式是什麼?我的文件是這樣的:Vim中的多行正則表達式:過濾掉文件中的文本塊

Text block 1: 
- something 
- something 
- something 
#tag1 #tag2 

Text block 2: 
- somethingelse 
- somethingelse 
#tag2 

Text block 3: 
- really interesting stuff 
- really interesting stuff 
#tag1 

etc 

Thesegreat tips向我指出使用\_.。因此,用於濾除包含#tag1兩個塊,我想出了這個:

\_.\{-}#tag1.* 

然而,這只是給了我文本塊1而不是進一步指向我的文本塊2(其中還包含標記) ,光標開始逐行向下移動。

我哪裏錯了?感謝您的任何解釋!


編輯:如何爲這種查詢創建一個多命令後續的here

+0

行只是爲了確保,你想匹配的文本塊1和文本塊3,而不是文本塊2,是正確的? – 2012-04-09 17:46:12

+0

@F J - 是的,這是正確的。塊1和塊2包含我想過濾掉的#tag1。 – marttt 2012-04-09 18:17:02

+0

但是第2塊不包含#tag1 ... – 2012-04-09 18:18:48

回答

3

這個工作對我來說,如果你想在塊的每一行匹配(使用在各個匹配塊中的所有文本猛拉到緩衝區)

^\(.\+\n\)\{-}#.*tag1 

所以,你可以做

g/^\(.\+\n\)\{-}#.*tag1/d A 

要刪除所有文本塊(當然,如果您想要將其替換爲y,則將d更改爲y)以#tag1結尾,並將它們插入寄存器A,然後"ap將它們全部粘貼(或插入模式下的<C-r>a

這讓我跳轉到以包含tag1的標籤結尾的每個塊的第一行。

\(\%^\|^\n\)\zs.\(.\+\n\)\{-}#.*tag1.*$ 

\_.\{-}#tag1.* 

的問題是,當你使用{ - }是非貪婪的,它仍然總是會只要有是具有#標記1線匹配低於您目前的線路。使用_。*或_。{ - }可能會非常危險。例如,當你上線的「文本塊2:」

Text block 2: 
- somethingelse 
- somethingelse 
#tag2 

Text block 3: 
- really interesting stuff 
- really interesting stuff 
#tag1 

你得到整個範圍的文本塊2的比賽,直到#標籤1文本塊後3

相反,如果你有

Text block 3: 
- really interesting stuff 
- really interesting stuff 
#tag1 

Text block 2: 
- somethingelse 
- somethingelse 
#tag2 

你只會匹配文本塊3

+0

非常好,這是工作。謝謝!但是 - 我怎麼能**複製文本塊+它下面的空行?**我已經嘗試在正則表達式的末尾添加'\ n's,但那不是。 – marttt 2012-04-10 11:37:47

+1

這非常棘手,因爲搜索很大程度上依賴於存在的這些換行符來區分不同的塊。我會做的是在粘貼所有與正則表達式匹配的代碼之後,運行全局搜索並用's /^#.* tag1。* \ n /&\ r'替換以在每一行之後放置一個換行符TAG1。你可能會喜歡它,只有在沒有新行的情況下才會這樣做,但這是一個全新的問題:p – 2012-04-10 11:50:09

+0

輝煌!我試圖自己弄清楚這個替換,但是'&'就是我所忽略的。 Vim仍然是新手,你可以做什麼。謝了哥們!現在我只需將所有步驟加入一個':SearchTags'命令。 – marttt 2012-04-10 12:48:59