代码之家  ›  专栏  ›  技术社区  ›  Dummy00001

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

  •  20
  • Dummy00001  · 技术社区  · 14 年前

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

    但我的问题是我还是找不到 模拟 属于 grep -v VIM内部:在缓冲区中找到一行 匹配给定的正则表达式。例如,日志文件中填充了中间位置包含短语的行 all is ok 我需要找到第一行不包含 一切都好 .

    我可以为此编写一个自定义函数,但目前这似乎是一个过度杀伤力,可能比本机解决方案慢。

    在Vim中有什么简单的方法可以做到吗?

    6 回复  |  直到 6 年前
        1
  •  13
  •   mykhal    14 年前

    你可以用负向后视运算符 @<!

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

    ( \v 只是让一些操作人员 ( @ & lt;! 不一定是反斜杠转义的)

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

        2
  •  22
  •   Neg_EV    14 年前

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

    :v/pattern/visual
    

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

    :g/pattern/visual
    

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

        3
  •  7
  •   Drasill    14 年前

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

    :g/all is ok/d
    

    你的 grep -v 可以用

    :v/error/d
    

    它将删除所有行 包含 错误 .

        4
  •  4
  •   gmoshkin    7 年前

    可能已经太迟了,但我想应该在某个地方说。

    Vim(从7.4版开始)附带了一个名为 洛吉帕特 这使得搜索不包含某些字符串的行非常容易。所以使用这个插件查找不包含 all is ok 这样做:

    :LogiPat !"all is ok"
    

    然后您可以在匹配的(或者在本例中不匹配的)行之间跳转 n N .

    您还可以使用逻辑操作,如 & | 要在一个模式中联接不同的字符串:

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

    LP LogiPat ,此命令将搜索包含单词的行 baz 不包含两者 foo 也不 bar .

        5
  •  2
  •   Carl Smotricz    14 年前

    我只是用“g”命令执行了一个有点笨拙的过程:

    :%g!/search/p
    

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

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

        6
  •  1
  •   ChrisW    6 年前

    可以使用g和空替换来迭代不匹配项:

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

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

    您需要使用ctrl-c从圆中退出(或继续转到文件的底部)。