任何空行之前的Vimgrep

时间:2017-01-11 22:54:26

标签: regex vim vimgrep

我有很多文件以我定义的某些标签开头。

示例:

=Title
@context
!todo
#topic
#subject
#etc

And some text (notice the blank line just before this text).

Foo
Bar

我想写一个Vim搜索命令(用vimgrep)来匹配空行之前的东西。

如何仅在第一个空行之前的行中进行grep?它会更快地进行grep动作吗?请不要像:grep那样提及Ag - silver search和二进制文件。

我知道\_.*可以匹配包括EOL在内的所有内容。我知道否定[^foo]。我成功地将所有内容与/[^^$]空行匹配。但我没有设法编写我的:vimgrep命令。谢谢你的帮助!

3 个答案:

答案 0 :(得分:0)

如果您想要一个一般解决方案适用于任何文件内容,请告诉您AFAK,您无法用那种形式的文字。你可能会问为什么?

  • 说明:

vimgrep需要一个模式参数来逐行搜索 ,其行为与:global cmd完全相同。

对于您的情况,我们需要获得第一个空行之前的第一部分。 (它可以扩展为:获取第一个非空白文本

致电:

  • A :内部不包含任何空白行的每个文本块

  • x :空行

使用这些仅 5 形式的内容文件,您可以获得带vimgrep的第一个A区块(情况2,4,5很明显):

  

1 | 2 | 3 | 4 |的 5

           

x | x | A | x |的 A

     

A | A | x | A | <强> X

     

x | x | A

     

A |

查看您的文件,它有以下形式:

  

A

     

X

     

<强> A

     

X

     

A

中间区块会导致一个问题,即您无法拆分第一个 A ,除非您使用某些已知的UNIQUE文本来划分它。< / p>

所以唯一的解决方案我只能 5个案例

:vimgrep /\_.\{-}\(\(\n\s*\n\)\+\)\@=/ %

答案 1 :(得分:0)

使用:vimgrep,您可以使用\%<XXl原子在特定行号下方搜索最多的AFAIK:

:vim /\%<20lfunction/ *.vim

该命令将在给定文件中找到第20行以上function的所有实例。

请参阅:help \%l

答案 2 :(得分:-1)

[...]始终匹配单个字符。 [^^$]匹配不是^$的字符。这不是你想要的。

您可以做的一件事是:

/\%^\%(.\+\n\)\{-}.\{-}\zsfoo/

匹配

  • \%^ - 文件的开头
  • \%( \) - 非捕获组
  • \{-} - 重复0次或更多次(尽可能少)
  • .\+ - 一个或多个非换行符
  • \n - 换行符
  • .\{-} - 0个或更多非换行符(尽可能少)
  • \zs - 比赛的正式开始

这将首先出现foo,从文件的开头开始,只搜索非空行。但这就是它的全部内容:您无法使用它来查找多个匹配项。

可替换地:

/\%(^\n\_.*\)\@<!foo/
  • \%( \) - 非捕获组
  • \@<! - not-preceded-by modifier
  • ^ - 行首
  • \n - 换行符
  • \_.* - 0个或更多任何角色

这匹配foo每次出现之前都没有空行(即行尾/换行组合)。