.png)
С помощью grep
я могу получить grep -v "my search"
все строки без «моего поиска».
Сsed
Я могу sed '/baz/!s/foo/bar/g'
найти замену текста в строках без «baz».
Есть ли способ сделать то же самое в Vim? И возможно ли сделать это без синтаксиса "s///", а только с использованием синтаксиса поиска "/"?
решение1
:g/pattern/
соответствует всем строкам, где найден шаблон.
:v/pattern/
делает наоборот. :h global
Подробнее см.
Вы можете использовать его так:
:v/pattern/norm Ipattern not found - <CR>
добавить "шаблон не найден - " к каждой строке, в которой нет "шаблона" или
:v/pattern/s/nrettap/pattern
заменить «nrettap» на «pattern» в каждой строке, где нет «pattern».
Надуманные примеры, да.
решение2
Для поиска строкнетнапример, содержащий foo, выполните:
/^\(\(.*foo.*\)\@!.\)*$
Источник:http://vim.wikia.com/wiki/Поиск_линий_не_содержащих_шаблона_и_других_полезных_поисков
решение3
Использование команды :v. Редактировать Традиционный подход к поиску строк, не соответствующих шаблону, заключается в использовании команды:v команда:
:v/Warning/p
При работе с большим файлом журнала, когда вы хотите отфильтровать как можно больше ненужных строк, прежде чем приступить к реальному поиску, можно воспользоваться хитрым приемом: сохраните файл под временным именем и удалите из него все несоответствующие строки:
:sav junk.log
:v/warning/d
Теперь вы редактируете клон вашего исходного файла, в котором удалены все строки, не соответствующие «предупреждению», и вы можете редактировать его по своему усмотрению.
Ссылка:https://vim.fandom.com/wiki/Поиск_линий_не_содержащих_шаблон_и_других_полезных_поисков
решение4
Другой подход — выполнение «внешнего grep»; из руководства (:help :grep
):
5.2 External grep
Vim can interface with "grep" and grep-like programs (such as the GNU
id-utils) in a similar way to its compiler integration (see |:make| above).
*:gr* *:grep*
:gr[ep][!] [arguments] Just like ":make", but use 'grepprg' instead of
'makeprg' and 'grepformat' instead of 'errorformat'.
When 'grepprg' is "internal" this works like
|:vimgrep|. Note that the pattern needs to be
enclosed in separator characters then.
If the encoding of the program output differs from the
'encoding' option, you can use the 'makeencoding'
option to specify the encoding.
*:lgr* *:lgrep*
:lgr[ep][!] [arguments] Same as ":grep", except the location list for the
current window is used instead of the quickfix list.
Для меня grepprg
установлено значение по умолчанию (см. с :set grepprg
), которое использует внешний grep
, и поэтому я мог бы сделать
:grep -v 'my_pattern' %
где %
относится к имени текущего файла (см :help :_%
. ).
После этого можно использовать :copen
или :lopen
для поиска результатов в списках быстрых исправлений или местоположений (в зависимости от того, использовались ли :grep
или соответственно).:lgrep
ПРИМЕЧАНИЕ
Внешний grep всегда будет работать насохраненофайл, а не в буфере. Помните об этом, когда получаете противоречивые результаты.