Ответ 1
Try
:%s/\[\(\d\+\)\]/\=join(['[', submatch(1) - 1, ']'], '')/g
EDIT: я добавил \+
после \d
, если вы хотите совместить более чем однозначные числа.
Учитывая следующий текст в Vim:
[2] [3] [4]
Я хочу выполнить поиск и заменить и произвести следующее:
[1] [2] [3]
Я знаю, как извлекать числа, используя обратную ссылку через поиск и замену:
:%s/\[\(\d\)\]/[\1]/g
Но теперь вопрос в том, как вы идете об уменьшении значения \1.
Любые идеи?
Try
:%s/\[\(\d\+\)\]/\=join(['[', submatch(1) - 1, ']'], '')/g
EDIT: я добавил \+
после \d
, если вы хотите совместить более чем однозначные числа.
Когда вы используете \zs
и \ze
для привязки числа внутри скобок без их сопоставления, замена становится проще, потому что вам не нужно конкатенации в замене:
:%s/\[\zs\d\+\ze]/\=submatch(0)-1/g
Попробуйте следующее:
%s:\d:\r&\r:g
Тогда
s/\d/\=submatch(0)-1/
И теперь вам нужно присоединиться к строкам.