Поиск и замена Vim путем уменьшения обратного задания?

Учитывая следующий текст в Vim:

[2] [3] [4]

Я хочу выполнить поиск и заменить и произвести следующее:

[1] [2] [3]

Я знаю, как извлекать числа, используя обратную ссылку через поиск и замену:

:%s/\[\(\d\)\]/[\1]/g

Но теперь вопрос в том, как вы идете об уменьшении значения \1.

Любые идеи?

Ответ 1

Try

:%s/\[\(\d\+\)\]/\=join(['[', submatch(1) - 1, ']'], '')/g

EDIT: я добавил \+ после \d, если вы хотите совместить более чем однозначные числа.

См. : help subst-replace-special

Ответ 2

Когда вы используете \zs и \ze для привязки числа внутри скобок без их сопоставления, замена становится проще, потому что вам не нужно конкатенации в замене:

:%s/\[\zs\d\+\ze]/\=submatch(0)-1/g

Ответ 3

Попробуйте следующее:

%s:\d:\r&\r:g

Тогда

s/\d/\=submatch(0)-1/

И теперь вам нужно присоединиться к строкам.