Найти первую несогласованную строку в VIM
Иногда бывает, что мне приходится просматривать различные файлы журналов и трассировки в Windows и, как правило, я использую для этого VIM.
Моя проблема заключается в том, что я все еще не могу найти аналог grep -v
внутри VIM: найдите в буфере строку не, соответствующую данному регулярному выражению. Например. файл журнала заполняется строками, которые где-то в середине содержат фразу all is ok
, и мне нужно найти первую строку, которая не содержит all is ok
.
Я могу написать для этого настраиваемую функцию, но в настоящий момент это кажется излишним и, вероятно, медленнее, чем собственное решение.
Есть ли простой способ сделать это в VIM?
Ответы
Ответ 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
Это говорит о том, что распечатывать несогласованные строки... не уверен, что это сработало, но в итоге получилось, что курсор расположен на первой несогласованной строке.
(конечно, замените какую-либо другую строку для "поиска" )