在VIM中找到第一个不匹配的行

时间:2010-06-23 13:10:58

标签: search vim

有时我需要在Windows上查看各种日志和跟踪文件,通常我会将其用于VIM。

我的问题是,我仍然无法在VIM中找到grep -v的任何模拟:在缓冲区中找到一条匹配给定的行表达。例如。日志文件中填充了中间某处包含短语all is ok的行,我需要查找不包含all is ok的第一行。

我可以为此编写一个自定义函数,但此刻似乎有点矫枉过正,而且可能比本机解决方案慢。

在VIM中有没有简单的方法呢?

7 个答案:

答案 0 :(得分:22)

我相信如果您只想将光标放在第一个不匹配的行上,您可以使用visual作为全局命令中的命令。所以:

:v/pattern/visual

将光标留在第一个不匹配的行。或者:

:g/pattern/visual

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

答案 1 :(得分:13)

您可以使用负面后顾运算符@<!

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

\v只会导致某些运算符(如(@<!)不得反斜杠转义)

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

答案 2 :(得分:7)

我经常在你的情况下,所以要“清理”我使用的日志文件:

:g/all is ok/d

您的grep -v可以通过

实现
:v/error/d

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

答案 3 :(得分:4)

可能已经太晚了,但我认为应该在某处说。

Vim(自版本约为7.4)附带一个名为 LogiPat 的插件,这使得搜索不包含某些字符串的行非常容易。因此,使用此插件查找不包含all is ok的行是这样的:

:LogiPat !"all is ok"

然后,您可以在匹配(或在此情况下不匹配)的行与nN之间跳转。

您还可以使用&|等逻辑操作在一种模式中加入不同的字符串:

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

LPLogiPat的简写,此命令将搜索包含单词baz但不包含foobar的行

答案 4 :(得分:2)

我只是使用“g”命令管理了一个有点klutzy的程序:

:%g!/search/p

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

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

答案 5 :(得分:1)

您可以使用g和空替换来遍历不匹配项:

:g!/pattern/s/^//c

如果您每次都回答“ n”,甚至都不会将该文件标记为已更改。

您需要ctrl-C才能从圆中逸出(或继续移至文件底部)。

答案 6 :(得分:0)

可以用下面一行搜索,按n跳到第一个不匹配的行

^\(.*all is ok\)\@!.*$

运营商细分:

^           -> means start of the line
\( and \)   -> To match a whole string multiple times, it must be grouped into one item. This is done by putting "\(" before it and "\)" after it.
\@!         -> Matches with zero width if the preceding atom does NOT match at the current position.
.*          -> Matches any character repeated 1 or more times
$           -> end of the line

这是它的工作原理示例动画。为简单起见,我搜索了单词 apple。 enter image description here