Подтвердить что ты не робот

Как заменить шаблон только на строки, которые содержат или не содержат другой шаблон?

Скажем, у меня есть текст, содержащий слова red и blue.

Как заменить вхождения слова blue словом green только во всех строках, содержащих слово red?

Аналогично, как заменить blue на green во всех строках, не содержащих слова red?

4b9b3361

Ответ 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" в начале строки, будут совпадать, поэтому строки с "баром" на других линиях остаются нетронутыми.