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

29

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

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

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

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

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

Сейчас замену я попробовал

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

Но это дает в качестве выхода {(10)}

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

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

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

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

Бернхард
источник

Ответы:

37

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

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

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

порыв
источник
Обратите внимание, что круглые скобки для перехвата имеют обратную косую черту.
Рэндалл
0

Недавно я унаследовал некоторый унаследованный код и хотел заменить все вхождения, такие как:

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\)

это позволит вам просмотреть каждый матч и выбрать, изменить его или нет.

yagad
источник
0

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

%s/print\( .*\)/logging.info\(\1\)/gc
Тим Розенов
источник
Это действительно никак не отвечает на первоначальный вопрос
Бернхард,