Vim поиск и замена по убыванию обратной ссылки? - PullRequest
10 голосов
/ 18 мая 2009

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

[2] [3] [4]

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

[1] [2] [3]

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

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

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

Есть идеи?

Ответы [ 3 ]

16 голосов
/ 18 мая 2009

Попробуйте

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

РЕДАКТИРОВАТЬ: я добавил \+ после \d на случай, если вы хотите сопоставить более чем однозначные числа.

См. : help sub-replace-special

2 голосов
/ 03 января 2013

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

:%s/\[\zs\d\+\ze]/\=submatch(0)-1/g
0 голосов
/ 18 мая 2009

Попробуйте это:

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

Тогда

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...