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

Dum*_*001 24 vim search

有时候我必须在Windows上查看各种日志和跟踪文件,通常我会将其用于VIM.

我的问题是,虽然我仍然找不到任何模拟grep -vVIM里面:寻找缓冲区行匹配给定的正则表达式.例如,日志文件中填充了中间某处包含短语的行all is ok,我需要查找不包含的第一行all is ok.

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

在VIM中有什么简单的方法吗?

Neg*_*_EV 22

我相信如果你只想让你的光标在第一个不匹配的行上结束,你可以在全局命令中使用visual作为命令.所以:

:v/pattern/visual
Run Code Online (Sandbox Code Playgroud)

将光标留在第一个不匹配的行.要么:

:g/pattern/visual
Run Code Online (Sandbox Code Playgroud)

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

  • 它找到从文件开头开始的第一个非匹配行,但不从当前光标位置开始.使用`:.,$ v/pattern/vi`从光标位置进行搜索. (7认同)
  • 德尼尔森:你应该提交你的答案作为答案 (2认同)

myk*_*hal 16

你可以使用负面的后视操作员 @<!

例如,要找到所有不包含"a"的行,请使用 /\v^.+(^.*a.*$)@<!$

(\v只是导致一些运营商喜欢(@<!不是必须反斜杠转义)

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

  • 这有效,但速度很慢.我认为使用`/\v^((.*all is ok.*)@!.)*$`更有效率,如vim [wiki](http://vim.wikia.com/wiki)所述/ Search_for_lines_not_containing_pattern_and_other_helpful_searches). (2认同)

Dra*_*ill 7

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

:g/all is ok/d
Run Code Online (Sandbox Code Playgroud)

grep -v可以实现

:v/error/d
Run Code Online (Sandbox Code Playgroud)

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


gmo*_*kin 5

可能已经为时已晚,但是我认为这应该在某个地方说。

Vim(大约从7.4版本开始)带有一个名为LogiPat的插件,这使查找不包含某些字符串的行变得非常容易。因此,使用此插件查找不包含的行all is ok是这样完成的:

:LogiPat !"all is ok"
Run Code Online (Sandbox Code Playgroud)

然后你就可以匹配之间跳转(或在这种情况下不匹配),用线nN

您还可以使用逻辑运算符(例如&和)|在一个模式中连接不同的字符串:

:LP !("foo"|"bar")&"baz"
Run Code Online (Sandbox Code Playgroud)

LP是简写LogiPat,而这个命令将搜索包含字线baz,并且不包含既不foo也没有bar