Інтерактивний пошук / заміна регулярного виразу в Vim?


265

Я знаю, що регулярний вимір для глобальної заміни,

     %s/old/new/g

Як ви працюєте з інтерактивною пошуковою заміною у Vim ?

Відповіді:


462

Додайте прапор c (у командному рядку vim):

:%s/old/new/gc

дасть вам підказку "так / ні" при кожному появі "старого".

"старий" виділяється в тексті;  У нижній частині вікна написано "замінити новим (y / n / a / q / l / ^ E / ^ y)?"

Вбудована довідка Vim пропонує корисну інформацію про доступні варіанти, коли буде обрана заміна з підтвердженням. Використання:

:h :s

Потім перейдіть до розділу з опціями підтвердження. Скріншот нижче:

Текст із написом "[C] Підтвердити кожну заміну. ​​[...] CTRL-Y для прокручування екрана вниз"

Наприклад, для підстановки цього та всіх інших збігів використовуйте a.


30
+1, сьогодні я дізнався щось нове! vim має стільки прихованих секретів .. :)
Марк Новаковський

10
Навчання команд vim трохи схоже на гру Nethack. Ніколи не знаєш, які чудеса збирається здійснити один персонаж.
Марк Бік

22
Я думаю, що "с" є для "підтвердження"
матір

8
Я, чесно кажучи, не намагаюся сприймати це як химерне, але все це можна було б знайти, виконуючи ": help: s", який би привів вас прямо до ": help: s_flags".
Джеремі Кантрелл

13
@jeremy: для цього потрібно знати, що команда довідки існує, і знати, що потрібно ввести перемикач "двокрапка", щоб перейти до відповідного файлу довідки. Як чи де дізнатися це?
Денніс

79

Марк Бік зазначив, використовуючи:

%s/old/new/gc

для глобального пошуку замініть підтвердженням для кожної заміни. Але я також насолоджуюся інтерактивною переконанням, що старий текст буде відповідати правильно. Спочатку я здійснюю пошук за допомогою регулярного вираження, а потім використовую цей шаблон:

/old.pattern.to.match
%s//replacement/gc

У s//використанні буде останній шаблон пошуку.


9
Одна з найбільших речей щодо використання / навчання vim - це лише те, наскільки глибоко йде кроляча нора!
кен

2
Приємно, я завжди робив пошук, потім використовуючи <Cr> /, щоб вставити останній пошук у команду-заміну.
Атілла Філіз

Саме те, що мені не вистачає з піднесеного тексту!
Ксенофекс

Ця відповідь особливо корисна, адже я думаю, що багато разів ви вирішили замінити екземпляри слова, це слово, яке ви тільки що шукали.
M_M

20

Я думаю, що ви шукаєте c, наприклад s/abc/123/gc, це призведе до того, що VIM підтвердить заміну. Дивіться: довідка: замініть додаткову інформацію.


9

Зазвичай я використовую команду find / substitute / next / repeat :-)

/old<CR>3snew<ESC>n.n.n.n.n.n.n.

Це find "old", substitute 3 characters for "new", find next, repeat substitute, і так далі.

Це болі за масових підстановок, але це дозволяє вибірково ігнорувати деякі старі випадки (просто натискаючи nще раз, щоб знайти наступний замість того, .щоб повторити заміну).


Я також це використовую навіть для подібних текстів. (3cW <текст> <ESC> <переїзд на нове місце>. <Переміщення>. <Переміщення>)
страгер

1
Це не антипатент! Це солодко. І ви можете шукати в зворотному напрямку, використовуючи N. Дійсно добре, якщо ви бачите слово і хочете його змінити. * cwNewText <ESC> Nnn (Це відскочить від слова під курсором, але потім скаче назад, як тільки ви змінили наступне явище.
PEZ

що таке <CR>?
Інше

9

Якщо ви просто хочете порахувати кількість випадків "abc", ви можете зробити це %s/abc//gn. Це нічим не замінює, а лише повідомляє кількість випадків "abc".


3

Якщо ваш текст заміни потрібно змінювати для кожного збігу, що збігається (тобто не просто вибираючи Так / Ні, щоб застосувати єдину заміну), ви можете використовувати плагін Vim, який я створив під назвою " інтерактивна заміна" .


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