Как выполнить обратный поиск в Vim? (т.е. получить строки, не содержащие шаблон)

Как выполнить обратный поиск в Vim? (т.е. получить строки, не содержащие шаблон)

С помощью 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 всегда будет работать насохраненофайл, а не в буфере. Помните об этом, когда получаете противоречивые результаты.

Связанный контент