Я можу використовувати
: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&
Як зазначив Інго, :&забуває ваші прапори. Оскільки ви використовуєте /g, правильною командою буде :&&:
:5s/foo/bar/g
:12&&
Побачити :help :&і друзів.
:&. Якщо є прапори ( s/../../g), все-таки потрібно використовувати :&&...
\(\%5l\|\%12l\)більш неясним, ніж:&
Ви завжди можете додати a cдо кінця. Це вимагатиме підтвердження для кожного матчу.
:5,12s/foo/bar/gc
gу грі є прапор)
n5 або 6 разів є більш обтяжливим, ніж додавання \(\%5l\|\%12l\)до заміни?
Цікаве питання. Здається, що існує лише вибір діапазону, а не вибір кількох рядків:
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.
У сценарії (використовуючи тут документ, який обробляє введення до маркера EndCommand) це буде виглядати так:
ed file <<EndCommands
5
s/foo/bar/g
7
s/foo/bar/g
wq
EndCommands
Очевидно, що команди ed також можуть використовуватися в командному рядку.
vimальтернативою.
:s, але все ще існує дублювання :sкоманди (чого рішення romainl уникає).
sedОднак моїм уподобанням було б ...