Интерактивный поиск / замена регулярных выражений в Vim?

234

Я знаю регулярное выражение для выполнения глобальной замены,

     %s/old/new/g

Как вы собираетесь выполнять интерактивный поиск-замену в Vim?

Теги:
vim

6 ответов

380
Лучший ответ

Добавьте флаг c (в командной строке vim):

:%s/old/new/gc

выдаст подсказку "да/нет" при каждом появлении слова "старый".

Изображение 4753

Встроенная справка Vim предлагает полезную информацию о параметрах, доступных после выбора замены с подтверждением. Использование:

:h :s

Затем перейдите к разделу подтверждения параметров. Снимок экрана ниже:

Изображение 4754

Например, чтобы заменить это и все оставшиеся матчи, использовать. a

  • 26
    +1, сегодня я узнал что-то новое! Vim имеет так много скрытых секретов .. :)
  • 0
    В самом деле! Я не знал о модификаторе c.
Показать ещё 10 комментариев
70

Марк Бик указал, используя:

%s/old/new/gc

для глобального поиска заменить на подтверждение для каждой подстановки. Но я также наслаждаюсь интерактивной проверкой того, что старый текст будет соответствовать правильно. Сначала я выполняю поиск с регулярным выражением, затем повторно использую этот шаблон:

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

s// будет использовать последний шаблон поиска.

  • 8
    Одна из главных особенностей использования / изучения vim - насколько глубоко заходит кроличья нора!
  • 2
    Хорошо, я всегда делал поиск, затем использовал <Cr> /, чтобы вставить последний поиск в команду замены.
Показать ещё 1 комментарий
17

Я думаю, что вы ищете c, например s/abc/123/gc, это заставит VIM подтвердить замены. См.: Help: замените дополнительную информацию.

9

Если вы просто хотите подсчитать количество вхождений "abc", вы можете сделать %s/abc//gn. Это ничего не заменяет, а просто сообщает количество вхождений "abc".

8

Обычно я использую команду 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 снова, чтобы найти следующий вместо ., чтобы повторить замещение).

  • 0
    Я также использую это, даже для похожих текстов. (3cW <texthere> <ESC> <переместить в новое место>. <Переместить>. <Переместить>.)
  • 1
    Это не антипаттерн! Это мило. И вы можете искать в обратном направлении, используя N. Действительно хорошо, если вы видите слово и хотите изменить его. * cwNewText <ESC> Nnn (Это отскочит от слова под курсором, но затем вернется назад, как только вы изменили следующее вхождение.
Показать ещё 1 комментарий
3

Если ваш текст замены должен измениться для каждого совпадающего события (т.е. не просто выбрать Да/Нет для применения сингулярной замены), вы можете использовать плагин Vim, который я сделал под названием interactive-replace.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню