Михаил Юдин

VIM поиск по тексту и замена

Великая точка g: как искать текстовые вхождения и делать замену, волшебный оператор поиска.


Выключите пожалуйста блокировку рекламы для этого сайта чтобы поддержать проект

Для поиска в VIM по тексту есть несколько способов.

Сделаю сразу несколько замечаний:

  • для подсветки при поиске желательно включить подсветку вхождений текста set hlsearch incsearch
  • по умолчанию поиск регистрозависимый set ignorecase smartcase

Это всё желательно прописать в vimrc или init.vim (если пользуетесь neovim).

Обычный поиск по тексту

Первый и частоиспользуемый способ поиска в тексте это слеш (/).

Пример: /пример.

Поиск с выполнением команд

Поиск с заменой текста или выполнением других команд начинается с двоеточия (:).

После двоеточия идёт указание диапазона применимости команды. Это может быть:

  • % - применение ко всему документу
  • $ - применение к концу файла
  • 15:32 - применение к диапазону строк с 15-ой по 32-ю
  • . - применение к текущей строке (можно опустить)

Далее идёт команда, например s - сокр. substitute. Затем её параметры, например слеши для разделения искомого от заменяемого.

Так же вместо слешей-разделителей можно использовать другие символы, см. Alternate delimiters for the replace command

В конце разделителей для замены могут быть использованы следующие модификаторы:

  • g - поиск и заменаа других вхождений в диапазоне
  • i - не учитывать регистр, т.е. на /text/ сматчится text и tExT
  • c - перед каждой заменой будет спрашивать, заменить или нет + другие варианты =)

Полный пример: :15:$s/зачем/затем/gic.

Более подробно про регулярки VIM можно поизучать например тут: http://vimregex.com/ или :h [regexp](regexp).

Поиск с заменой

Примеры:

Замена первого вхождения текста в текущей строке (точка . опущена, можно было написать :.s/текст/новый текст/): :s/текст/новый текст/.

Для поиска и замены ПОЛНОГО вхождения текста используются операторы < и >: :s/\<текст\>/новый текст/.

Различие в том, что первый вариант заменит этоттекствот на этотновый текствот. Тогда как второй найдёт только слово (слова) “текст” и заменит.

Та самая точка G

Часто встречается задача найти и удалить строки текста по какому-нибудь критерию.

Наипростейшее решение для строк включающих символ решётки: :g/#/d.
Каждая строка (g - global), содержащая решётку, будет удалена (d - сокр. delete).

Подобное я испоьзую для удаления комментариев в json: :g#//#d

Ещё забавный пример для изменения порядка строк на обратный: :g/^/m0.
Здесь для каждой строки у которой есть начало выполняем команду move на первую (нулевую) строку. Так как команда выполняется для каждой строки текста начиная с первой, перемещение каждой последующей строки включая последнюю будет происходить на первую строку и порядок строк поменяется.

Если решили перейти с какой-либо IDE на VIM, скорее всего заинтересует:

А вообще, чаще смотрите в справку VIM: :h :, :h substitute например.


Поддержать




Выключите пожалуйста блокировку рекламы для этого сайта чтобы поддержать проект

Остались вопросы или есть пожелания, замечания — пишите в комментарии: