Замініть за допомогою 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\)

це дозволить вам переходити кожен матч і вибирати, змінити ви його чи ні.


0

Кращий спосіб дозволити вам переходити кожен матч - додати "c" до кінця коду, а не переходити по рядку

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

Це справді ніяк не відповідає на початкове запитання
Бернхард
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.