Поиск и замена в vim в определенных строках

Я могу использовать

:5,12s/foo/bar/g

для поиска foo и заменить его на bar между строками 5 и 12. Как это сделать только в строках 5 и 12 (а не в строках между ними)?

Ответ 1

Vim имеет специальные атомы регулярного выражения, которые соответствуют определенным строкам, столбцам и т.д.; вы можете использовать их (возможно, в дополнение к диапазону), чтобы ограничить совпадения:

:5,12s/\(\%5l\|\%12l\)foo/bar/g

См. :help /\%l

Ответ 2

Вы можете сделать замену в строке 5 и повторить ее с минимальными усилиями в строке 12:

:5s/foo/bar
:12&

Как указано Ingo, :& забывает ваши флаги. Поскольку вы используете /g, правильная команда будет :&&:

:5s/foo/bar/g
:12&&

См. :help :& и друзей.

Ответ 3

Вы всегда можете добавить c в конец. Это потребует подтверждения для каждого матча.

:5,12s/foo/bar/gc

Ответ 4

Интересный вопрос. Кажется, что только выбор диапазона и выбор нескольких строк:

http://vim.wikia.com/wiki/Ranges

Однако, если у вас есть что-то особенное в строках 5 и 12, вы можете использовать оператор :g. Если ваш файл выглядит так (номера только для справки):

 1     line one
 2     line one
 3     line one
 4     line one
 5     enil one
 6     line one
 7     line one
 8     line one
 9     line one
10     line one
11     line one
12     enil one

И вы хотите заменить one на eno на строки, где enil вместо line:

:g/enil/s/one/eno/

Ответ 5

Вы можете использовать ed - текстовый текстовый редактор с аналогичными командами для vi и vim. Вероятно, это предшествует vi и vim.

В script (используя документ здесь, который обрабатывает ввод до маркера EndCommand), он будет выглядеть так:

ed file <<EndCommands
    5
    s/foo/bar/g
    7
    s/foo/bar/g
    wq
EndCommands

Очевидно, что команды ed также могут использоваться в командной строке.