2012-04-09 84 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