Найти первую несовпадающую строку в VIM - PullRequest
21 голосов
/ 23 июня 2010

Иногда бывает, что мне приходится просматривать различные файлы журналов и трассировки в Windows, и обычно я использую для этой цели VIM.

Моя проблема заключается в том, что я до сих пор не могу найти ни одного аналога из grep -v внутри VIM: найти в буфере строку не , соответствующую данному регулярному выражению. Например. файл журнала заполнен строками, которые где-то посередине содержат фразу all is ok, и мне нужно найти первую строку, которая не содержит all is ok.

Я могу написать специальную функцию для этого, но в данный момент это кажется излишним и, вероятно, медленнее, чем собственное решение.

Есть ли простой способ сделать это в VIM?

Ответы [ 6 ]

22 голосов
/ 23 июня 2010

Полагаю, если вы просто хотите, чтобы курсор находился в первой несоответствующей строке, вы можете использовать визуал в качестве команды в вашей глобальной команде.Итак:

:v/pattern/visual

оставит курсор на первой несоответствующей строке.Или:

:g/pattern/visual

оставит курсор на первой совпадающей строке.

13 голосов
/ 23 июня 2010

вы можете использовать оператор отрицательного просмотра @<!

например. чтобы найти все строки, не содержащие «а», используйте /\v^.+(^.*a.*$)@<!$

(\v просто приводит к тому, что некоторые операторы, такие как ( и @<!, не должны быть экранированы обратной косой чертой)

более простой метод - удалить все строки, соответствующие или не соответствующие шаблону (:g/PATTERN/d или :g!/PATTERN/d соответственно)

7 голосов
/ 23 июня 2010

Я часто в вашем случае, поэтому, чтобы "почистить" файлы журналов, которые я использую:

:g/all is ok/d

Ваш grep -v может быть достигнут с помощью

:v/error/d

, который будетудалить все строки, которые не содержат ошибка .

4 голосов
/ 03 августа 2017

Вероятно, уже слишком поздно, но я думаю, что это должно быть где-то сказано.

Vim (начиная с версии 7.4) поставляется с плагином LogiPat , который упрощает поиск строк, в которых нет какой-либо строки. Поэтому с помощью этого плагина поиск строк, не содержащих all is ok, выполняется следующим образом:

:LogiPat !"all is ok"

И затем вы можете переходить между совпадающими (или в данном случае не совпадающими) строками с n и N.

Вы также можете использовать логические операции, такие как & и |, чтобы объединить разные строки в одном шаблоне:

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

LP является сокращением для LogiPat, и эта команда будет искать строки, содержащие слово baz и не содержащие ни foo, ни bar.

2 голосов
/ 23 июня 2010

Я только что справился с несколько запутанной процедурой, используя команду "g":

:%g!/search/p

Это говорит о том, что нужно распечатать несоответствующие строки ... не уверен, что это сработало, но в итоге получилосьс курсором, расположенным на первой несоответствующей строке.

(конечно, вместо «поиска» подставьте другую строку)

1 голос
/ 21 июня 2018

Вы можете перебрать несоответствия, используя g и нулевую подстановку:

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

Если вы отвечаете «n» каждый раз, когда вы даже не пометите файл как измененный.

Вам нужно ctrl-C, чтобы вырваться из круга (или продолжать идти в конец файла).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...