На цій сторінці вже є три чудові відповіді , але, як в коментарі запропонував Люк Ермітт , якщо ви робите це з манжети, важливим є те, наскільки швидко і легко ви зможете виправити робоче рішення.
Таким чином, це проблема, яку я насправді не використовував би :substitute
взагалі: це проблема, яку легко вирішити за допомогою команд звичайного режиму та рекурсивного макросу:
(При необхідності) Спочатку вимкніть 'wrapscan'
. Регулярний вираз, який ми будемо використовувати, буде відповідати бажаному тексту результату, а також початковому тексту, так що з 'wrapscan'
, макрос інакше буде продовжувати відтворюватися назавжди. (Або поки ви не зрозумієте, що відбувається, і натисніть <C-C>
.):
:set nowrapscan
Налаштуйте пошуковий термін (використовуючи той самий базовий регулярний вираз, який уже згадувався в існуючих відповідях):
/#\d\+\(\.\d\+\)\?<CR>
(При необхідності) Перейти до першого матчу, натискаючи N
стільки разів, скільки потрібно,
(При необхідності) Змініть першу відповідність на потрібний текст:
cE#1<Esc>
Очистіть "q
регістр і починайте записувати макрос:
qqqqq
Виберіть поточний лічильник:
yiW
Перейти до наступного матчу:
n
Замініть поточний лічильник на той, який ми щойно потягнули:
vEp
Збільшення лічильника:
<C-A>
Відтворити макрос q
. Реєстрація "q
все ще порожня, оскільки ми її очистили на кроці 5, тому в цей момент нічого не відбувається:
@q
Зупинити запис макросу:
q
Грайте в новий макрос і дивіться!
@q
Як і у всіх макросах, це виглядає як багато кроків, коли пояснюється, як я вже робив вище, але зауважте, що насправді введення цих текстів для мене дуже швидке: крім рекурсивної макро-записувальної коробки, вони все просто звичайні редагування команд, які я виконую весь час під час редагування. Єдиним кроком, коли мені довелося зробити що-небудь, навіть наближаючись до мислення, був крок 2, де я написав регулярний вираз для здійснення пошуку.
Відформатована як дві команди режиму командного рядка та серія натискань клавіш, швидкість цього типу рішення стає більш зрозумілою: я можу створити наступне досить швидко, як я можу набрати його 1 :
:set nowrapscan
/#\d\+\(\.\d\+\)\?
cE#1<Esc>qqqqqyiWnvEp<C-A>@qq@q
Можливо, я міг би придумати інші рішення на цій сторінці, трохи подумавши та посилаючись на документацію 2 , але, як тільки ти зрозумієш, як працюють макроси, їх дійсно легко вимкнути з будь-якою швидкістю, яку ти зазвичай редагуєш.
1: Там є ситуації , коли макроси вимагають більше думки, але я вважаю , що вони не придумали багато на практиці. І взагалі ситуації, коли вони трапляються, - це такі, де макрос - єдине практичне рішення.
2: Не маю на увазі, що інші відповіді не могли легко підійти до своїх рішень: вони просто вимагають навичок / знань, які я особисто не так легко під рукою. Але всі користувачі Vim знають, як використовувати регулярні команди редагування!
perldo
, можете скористатися:%perldo s/#\K\d+(\.\d+)?/++$i/ge