Я могу использовать
:5,12s/foo/bar/g
для поиска foo
и заменить его на bar
между строками 5 и 12. Как это сделать только в строках 5 и 12 (а не в строках между ними)?
Я могу использовать
:5,12s/foo/bar/g
для поиска foo
и заменить его на bar
между строками 5 и 12. Как это сделать только в строках 5 и 12 (а не в строках между ними)?
Vim имеет специальные атомы регулярного выражения, которые соответствуют определенным строкам, столбцам и т.д.; вы можете использовать их (возможно, в дополнение к диапазону), чтобы ограничить совпадения:
:5,12s/\(\%5l\|\%12l\)foo/bar/g
См. :help /\%l
Вы можете сделать замену в строке 5 и повторить ее с минимальными усилиями в строке 12:
:5s/foo/bar
:12&
Как указано Ingo, :&
забывает ваши флаги. Поскольку вы используете /g
, правильная команда будет :&&
:
:5s/foo/bar/g
:12&&
См. :help :&
и друзей.
Вы всегда можете добавить c
в конец. Это потребует подтверждения для каждого матча.
:5,12s/foo/bar/gc
Интересный вопрос. Кажется, что только выбор диапазона и выбор нескольких строк:
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/
Вы можете использовать ed
- текстовый текстовый редактор с аналогичными командами для vi и vim. Вероятно, это предшествует vi и vim.
В script (используя документ здесь, который обрабатывает ввод до маркера EndCommand), он будет выглядеть так:
ed file <<EndCommands
5
s/foo/bar/g
7
s/foo/bar/g
wq
EndCommands
Очевидно, что команды ed также могут использоваться в командной строке.