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

15

Мне нужно искать строки, которые содержат какое-то слово, но не содержат второго слова.

Например, найдите строки, содержащие слово «This», но не слово «red».

так что для файла, содержащего эти строки

This is a blue coat
This is a red  coat
This is a purple coat
That is a coat

Поиск будет искать только первую и третью строки.

Спасибо за любой совет!

Лео Симон
источник
Вы можете использовать плагин LogiPat, который распространяется с более новыми Vims
Christian Brabandt

Ответы:

23

Вы можете использовать эту команду для печати строк, содержащих, Thisа не red:

:g/\(.*This\)\&\(.*red\)\@!
  • \&разделяет ветви как логические, ANDпотому что мы хотим, чтобы линии удовлетворяли двум условиям (ветвям),
  • \(.*This\)это первая ветвь, это может быть просто, Thisно это более общий способ,
  • \(.*red\)\@!является второй ветвью, \@!означает «совпадение нулевой ширины, если предыдущий атом не совпадает», как логическое NOT.

Другими словами:

\(.*This\)  \&  \(.*red\)\@!
°°°°°°°°°°  °°  °°°°°°°°°°°°
'This'      AND NOT 'red'
romainl
источник
Большое спасибо, это очень похоже на запрос через форматированный текст. Я смог использовать это, чтобы найти функции, отсутствующие строки документации.
Джошуа Детвилер
1

Посмотрите на этот пост.

Объедините его с ответом @romainl, и вы сможете делать все, что захотите.

Пример: допустим, я хочу добавить a constк функциям, у которых их нет.

    handleChange = value => {

VIM скрипт:

%s/\([ ]*\)\(\w* = .*$\)\&^\(\&\(.*const.*\)\@!.\)*$/\1const \2/gc

Выход:

    const handleChange = value => {

Объяснение:

\([ ]*\)\(\w* = .*$\)

- достань мне все строки, которые есть word =

\&

- объединить правила

^\(\&\(.*const.*\)\@!.\)*$

- строка не должна содержать const.

ATOzTOA
источник