Заменить с помощью VIM, повторно использовать часть шаблона поиска

Заменить с помощью VIM, повторно использовать часть шаблона поиска

Я работаю VImи пытаюсь настроить команду поиска и замены, чтобы выполнять некоторые замены, в которых я могу повторно использовать регулярное выражение, являющееся частью моей строки поиска.

Простым примером может служить строка, в которой я хочу заменить (10)на {10}, где 10 может быть любым числом.

Я зашёл так далеко

  .s/([0-9]*)/what here??/

что в точности соответствует той части, которую я хочу.

Теперь замена, я попробовал

  .s/([0-9]*)/{\0}/

Но это дает на выходе{(10)}

Затем я попробовал

 .s/(\zs[0-9]*\ze)/{\0}/

Однако это дало мне ({10}), что я тоже близко, но не то, что я хочу.

Думаю, мне нужна какая-то другая разметка/обратная ссылка вместо этой \0, но я не знаю, где искать. Так что вопрос в том, можно ли это сделать в vim, и если да, то как?

решение1

\0это все совпадение. Чтобы использовать только часть, вам нужно установить его так и использовать \1

.s/(\([0-9]*\))/{\1}/

Более подробную инструкцию вы можете найтиздесьили в справке vim.

решение2

Недавно я унаследовал часть устаревшего кода и хотел заменить все вхождения следующего вида:

print "xx"
print x,y
print 'xx'

к

logging.info("xy") 

или

logging.info(x,y)

Основываясь на предыдущем ответеи в надежде, что кому-то это принесет пользу, я использовал следующую команду, которая изменит все вхождения:

%s/print\( .*\)/logging.info\(\1\)/g

Если вы замените %на .и удалите, /gто в итоге получите

.s/print\( .*\)/logging.info\(\1\)

это позволит вам просмотреть каждое совпадение и решить, следует ли его изменить или нет.

решение3

Лучший способ просмотреть каждое совпадение — добавить «c» в конец кода, а не перебирать построчно.

%s/print\( .*\)/logging.info\(\1\)/gc

Связанный контент