我有很多文件,从我定义的一些标签开始。
示例:
=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命令。谢谢你的帮助!
发布于 2017-01-12 01:49:04
如果您想要一个通用解决方案,它对文件的任何内容都适用,那么让我告诉您,AFAK,您不能使用该文本形式进行。你可能会问为什么?
vimgrep需要一个模式参数来逐行搜索,它的行为与:global cmd完全一样。
对于您的情况,我们需要得到第一部分前面的第一个空行。(可以扩展到:获取第一个非空白文本)
让我们打电话:
使用这些只有5格式的内容文件,您可以获得第一个带有vimgrep的A块(案例2、4、5很明显):
1,
2,3,,4,,5
x _ x _ A _ x _ A
A,A,,,,,,
x \ x \ A
A _x
在您的文件中,它有以下形式:
一个 X A X 一个
中间块会导致一个问题,这就是为什么您不能拆分第一个A ,除非您用已知的唯一文本来分隔它。
因此,我可以找到的唯一的解决方案,5 cases是:
:vimgrep /\_.\{-}\(\(\n\s*\n\)\+\)\@=/ %发布于 2017-01-12 09:59:16
AFAIK使用:vimgrep的最多方法是使用\%<XXl原子搜索特定行号以下的内容:
:vim /\%<20lfunction/ *.vim该命令将在给定的文件中找到第20行以上的所有function实例。
见:help \%l。
发布于 2017-01-12 01:39:36
[...]总是匹配单个字符。[^^$]匹配一个不是^或$的字符。这不是你想要的。
你能做的一件事是:
/\%^\%(.\+\n\)\{-}.\{-}\zsfoo/这个匹配
\%^ -文件的开头\%( \) -非捕获组\{-} - ...重复0次或多次(尽可能少).\+ -1或更多非换行符\n -一条新行.\{-} -0或更多的非换行符(尽可能少)\zs -正式比赛开始这将找到foo的第一次出现,从文件的开头开始,只搜索非空行。但这就是它所能做的:你不能用它来找到多个匹配。
另一种选择是:
/\%(^\n\_.*\)\@<!foo/\%( \) -非捕获组\@<! -非-前面的修饰符^ -行的开始\n -换行线\_.* -0或更多这与没有空行(即行的起始/换行符组合)的任何地方出现的foo匹配。
https://stackoverflow.com/questions/41602224
复制相似问题