Как заменить шаблон только на строки, которые содержат или не содержат другой шаблон?
Скажем, у меня есть текст, содержащий слова red и blue.
Как заменить вхождения слова blue словом green только во всех строках, содержащих слово red?
Аналогично, как заменить blue на green во всех строках, не содержащих слова red?
Ответ 1
Чтобы заменить "синий" на "зеленый" в строках, содержащих "красный":
:g/red/s/blue/green
Сделать замену в строках, которые не содержат "красный":
:g!/red/s/blue/green
Ответ 2
Использовать адреса шаблона соответствия
Как и в sed, вы можете использовать шаблон для адресов, на которых будет работать. Например, учитывая следующий файл:
foo bar
bar
foo bar baz
bar baz
quux bar
Вы выполните команду, например следующую:
:g/^foo/s/bar/foobarbaz/g
Объяснение
Это позволит Vim применить соответствие шаблонов только к каждой строке, начинающейся с "foo", и выполнить замену на несколько совпадений в каждой соответствующей строке. Таким образом, хотя "бар" появляется на нескольких строках, с этим вызовом вы получите следующий результат:
foo foobarbaz
bar
foo foobarbaz baz
bar baz
quux bar
Обратите внимание, что только строки, начинающиеся с "foo" в начале строки, будут совпадать, поэтому строки с "баром" на других линиях остаются нетронутыми.