Search 在VIM中查找第一条不匹配的行

Search 在VIM中查找第一条不匹配的行,search,vim,Search,Vim,有时我不得不查看Windows上的各种日志和跟踪文件,通常我使用VIM 但我的问题是,我仍然无法在VIM中找到任何类似的grep-v:在缓冲区中找到一行与给定正则表达式匹配的非。例如,日志文件中的行在中间某处包含短语all is ok,我需要找到第一行不包含all is ok 我可以为此编写一个自定义函数,但目前看来,这似乎有些过分,而且可能比本机解决方案慢 在VIM中有什么简单的方法可以做到这一点吗?我刚刚用“g”命令管理了一个有点笨拙的过程: 这表示要打印出不匹配的行。。。不确定这是否有效,

有时我不得不查看Windows上的各种日志和跟踪文件,通常我使用VIM

但我的问题是,我仍然无法在VIM中找到任何类似的
grep-v
:在缓冲区中找到一行与给定正则表达式匹配的非。例如,日志文件中的行在中间某处包含短语
all is ok
,我需要找到第一行不包含
all is ok

我可以为此编写一个自定义函数,但目前看来,这似乎有些过分,而且可能比本机解决方案慢


在VIM中有什么简单的方法可以做到这一点吗?

我刚刚用“g”命令管理了一个有点笨拙的过程:

这表示要打印出不匹配的行。。。不确定这是否有效,但它最终将光标定位在第一个不匹配的行上


(当然,用其他字符串代替“搜索”)

您可以使用反向查找运算符
@

e、 g.要查找不包含“a”的所有行,请使用
/\v^.+(^.*a.*$)@

\v
只会导致一些运算符,如
@必须已反斜杠转义)


更简单的方法是删除与模式匹配或不匹配的所有行(
:g/pattern/d
:g!/pattern/d

我经常遇到您的情况,因此要“清理”我使用的日志文件:

:g/all is ok/d
您的
grep-v
可以通过

:v/error/d

这将删除所有不包含错误的行。

我相信如果您只是想让光标结束在第一个不匹配的行,您可以使用visual作为全局命令中的命令。因此:

:v/pattern/visual
将光标保留在第一个不匹配的行。或者:

:g/pattern/visual

将光标保留在第一个匹配行。

可能已经太晚了,但我认为应该在某个地方这样说

Vim(从7.4版开始)附带了一个名为LogiPat的插件,这使得搜索不包含字符串的行变得非常容易。因此,使用该插件查找不包含
的行是可以的
如下操作:

:LogiPat !"all is ok"
然后,您可以使用
n
n
在匹配(或在本例中不匹配)行之间跳转

您还可以使用逻辑操作,如
&
|
以一种模式连接不同的字符串:

:LP !("foo"|"bar")&"baz"

LP
LogiPat
的简写,此命令将搜索包含单词
baz
且既不包含
foo
也不包含
bar
的行。您可以使用g和空替换来迭代非匹配项:

:g!/pattern/s/^//c
如果每次回复“n”,您甚至不会将文件标记为已更改


您需要ctrl-C从循环中退出(或继续转到文件底部)。

/^.\+\(^.*一切正常。*$\)\@按需要工作-非常感谢!
:g!/PATTERN/p
产生了太多的输出。对于一些mln行文件,这不是一个选项。但是
:g!/PATTERN/d
看起来非常有用,例如,用于处理从stdin读取的缓冲区,但尚未保存到文件中。嗯……显然,
:g!/PATTERN/d
对于我的情况来说(忽略不感兴趣的行macthing PATTER)应该写为
:g/PATTERN/d
-without!-来删除不感兴趣的行。这是可行的,但速度非常慢。我认为使用vim上记录的
/\v^((.*all is ok.*)@!)*$
更有效。我发现
/\v^(.*PATTERN)@!/
似乎做得很好。可视命令也可以缩短为vi…因此您可以这样做:v/pattern/viIt从文件的开头找到第一个不匹配的行,但不是从当前光标位置开始。使用
:,$v/pattern/vi
从光标位置搜索。Denilson:您应该提交y我们的作为answer@Jefromi:谢谢你,我忘了
:v
:g!/pattern/s/^//c