я могу использовать
:5,12s/foo/bar/g
найти foo
и заменить его bar
между строками 5 и 12. Как я могу сделать это только в строках 5 и 12 (а не в строках между ними)?
В Vim есть специальные атомы регулярных выражений, которые соответствуют определенным строкам, столбцам и т. Д .; вы можете использовать их (возможно, в дополнение к диапазону) для ограничения совпадений:
:5,12s/\(\%5l\|\%12l\)foo/bar/g
Увидеть :help /\%l
Вы можете выполнить замену в строке 5 и повторить ее с минимальными усилиями в строке 12:
Как указал Инго,
:&
забывает ваши флаги. Поскольку вы используете/g
, правильная команда будет:&&
:Смотрите
:help :&
и друзья.источник
:&
. Если есть flags (s/../../g
), нужно использовать:&&
, хотя ...\(\%5l\|\%12l\)
это более неясно, чем:&
Вы всегда можете добавить
c
в конец. Это будет запрашивать подтверждение для каждого матча.источник
g
флаг)n
5 или 6 раз более обременительно, чем добавление\(\%5l\|\%12l\)
к оператору замены?Интересный вопрос. Похоже, есть только выбор диапазона и нет множественного выбора:
http://vim.wikia.com/wiki/Ranges
Однако, если у вас есть что-то особенное в строках 5 и 12, вы можете использовать
:g
оператор. Если ваш файл выглядит так (цифры только для справки):И вы хотите заменить
one
наeno
на линиях , где естьenil
вместо того , чтобыline
:источник
Вы можете использовать
ed
- строчно-ориентированный текстовый редактор с командами, аналогичными vi и vim. Вероятно, он появился раньше vi и vim.В сценарии (используя здесь документ, который обрабатывает ввод до маркера EndCommand) это будет выглядеть так:
Очевидно, что команды ed можно также использовать в командной строке.
источник
vim
альтернативой.:s
, но все же остается дублирование:s
команды (чего избегает решение romainl).sed
Хотя я бы предпочел ...