Подтвердить что ты не робот

Найти первую несогласованную строку в VIM

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

:v/pattern/visual

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

:g/pattern/visual

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

Ответ 3

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

:g/all is ok/d

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

:v/error/d

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

Ответ 4

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

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

:LogiPat !"all is ok"

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

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

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

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

Ответ 5

Мне просто удалось выполнить несколько klutzy-процедуру, используя команду "g":

:%g!/search/p

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

(конечно, замените какую-либо другую строку для "поиска" )