首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >任何空行前的Vimgrep

任何空行前的Vimgrep
EN

Stack Overflow用户
提问于 2017-01-11 22:54:26
回答 3查看 444关注 0票数 2

我有很多文件,从我定义的一些标签开始。

示例:

代码语言:javascript
复制
=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命令。谢谢你的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-12 01:49:04

如果您想要一个通用解决方案,它对文件的任何内容都适用,那么让我告诉您,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 \ x \ A

A _x

在您的文件中,它有以下形式:

一个 X A X 一个

中间块会导致一个问题,这就是为什么您不能拆分第一个A ,除非您用已知的唯一文本来分隔它。

因此,我可以找到的唯一的解决方案,5 cases是:

代码语言:javascript
复制
:vimgrep /\_.\{-}\(\(\n\s*\n\)\+\)\@=/ %
票数 0
EN

Stack Overflow用户

发布于 2017-01-12 09:59:16

AFAIK使用:vimgrep的最多方法是使用\%<XXl原子搜索特定行号以下的内容:

代码语言:javascript
复制
:vim /\%<20lfunction/ *.vim

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

:help \%l

票数 0
EN

Stack Overflow用户

发布于 2017-01-12 01:39:36

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

你能做的一件事是:

代码语言:javascript
复制
/\%^\%(.\+\n\)\{-}.\{-}\zsfoo/

这个匹配

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

这将找到foo的第一次出现,从文件的开头开始,只搜索非空行。但这就是它所能做的:你不能用它来找到多个匹配。

另一种选择是:

代码语言:javascript
复制
/\%(^\n\_.*\)\@<!foo/
  • \%( \) -非捕获组
  • \@<! -非-前面的修饰符
  • ^ -行的开始
  • \n -换行线
  • 任何字符的\_.* -0或更多

这与没有空行(即行的起始/换行符组合)的任何地方出现的foo匹配。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41602224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档