
Я работаю 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