Найти и заменить в Vim / Vi

Vim — самый популярный текстовый редактор командной строки. Он предустановлен в macOS и большинстве дистрибутивов Linux. Найти и заменить текст в Vim быстро и легко.

Базовый поиск и замена

В Vim вы можете найти и заменить текст с помощью команды :substitute:s).

Чтобы запускать команды в Vim, вы должны находиться в обычном режиме — режиме по умолчанию при запуске редактора. Чтобы вернуться в обычный режим из любого другого режима, просто нажмите клавишу «Esc».

Общая форма заменяющей команды следующая:

:[range]s/{pattern}/{string}/[flags] [count]

Команда ищет в каждой строке [range] щаблон {pattern} и заменяет его на {string}[count] раз (положительное целое число) повторяющее команду.

Если не указаны [range] и [count], заменяется только образец, найденный в текущей строке. Текущая строка — это строка, в которой находится курсор.

Например, чтобы найти первое вхождение строки ‘foo’ в текущей строке и заменить его на ‘bar’, вы должны использовать:

:s/foo/bar/

Чтобы заменить все вхождения шаблона поиска в текущей строке, добавьте g флаг:

:s/foo/bar/g

Если вы хотите найти и заменить шаблон во всем файле, используйте символ процента % в качестве диапазона. Этот символ указывает диапазон от первой до последней строки файла:

:%s/foo/bar/g

Если {string} часть опущена, она рассматривается как пустая строка, и соответствующий шаблон удаляется. Следующая команда удаляет все экземпляры строки ‘foo’ в текущей строке:

:s/foo//g

Вместо символа косой черты (/) можно использовать любой другой однобайтный символ, не являющийся буквенно-цифровым, за исключением разделителя. Эта опция полезна, если в шаблоне поиска или в строке замены есть символ ‘/’.

:s|foo|bar|

Для подтверждения каждой замены используйте c флаг:

:s/foo/bar/gc
replace with bar (y/n/a/q/l/^E/^Y)?

Нажмите, y чтобы заменить совпадение, или l чтобы заменить совпадение и выйти. Нажмите, n чтобы пропустить совпадение, q или, Esc чтобы выйти из замены. a вариант заменяет текущее совпадение и все остальные вхождения. Для прокрутки экрана вниз используйте CTRL Y ,  а для прокрутки вверх используйте CTRL E.

Вы также можете использовать регулярные выражения в качестве шаблона поиска. Приведенная ниже команда заменяет все строки, начинающиеся с ‘foo’, на ‘Vim is the best’:

:%s/^foo.*/Vim is the best/gc

Символ ^ (каретка) соответствует началу строки и .* соответствует любому количеству любых символов.

Чувствительность к регистру

По умолчанию операция поиска чувствительна к регистру; поиск «FOO» не будет соответствовать «Foo».

Чтобы игнорировать регистр в шаблоне поиска, используйте i флаг:

:s/Foo/bar/gi

Другой способ принудительно игнорировать регистр — это добавить c после шаблона поиска.

Если вы изменили настройку регистра по умолчанию и хотите выполнять поиск с учетом регистра, используйте I флаг:

:s/foo/bar/gI

Заглавные буквы C после шаблона приводят к поиску совпадений по регистру.

Диапазон поиска

Если диапазон не указан, замещающая команда работает только в текущей строке.

Диапазон может быть одной строкой или диапазоном между двумя строками. Спецификаторы строки разделяются символами , или ; . Диапазон можно указать с помощью абсолютного номера строки или специальных символов.

Например, чтобы заменить все вхождения ‘foo’ на ‘bar’ во всех строках, начиная со строки 3 по строку 10, вы должны использовать:

:3,10s/foo/bar/g

Диапазон является включительным, что означает, что первая и последняя строки включены в диапазон.

Точка . обозначает текущую строку, а $ знак доллара — последнюю строку. Чтобы заменить ‘foo’ во всех строках, начиная с текущей строки до последней:

:.,$s/foo/bar/

Спецификатор строки также можно установить с помощью символа « » или «-», за которым следует число, которое добавляется или вычитается из номера предыдущей строки. Если число после символа опущено, по умолчанию используется 1.

Например, чтобы заменить каждое ‘foo’ на ‘bar’, начиная с текущей строки и четырех следующих строк, введите:

:., 4s/foo/bar/g

Замена всего слова

Команда замены ищет образец как строку, а не целое слово. Если, например, вы искали «gnu», поиск совпадет с тем, что «gnu» встроено в слова большего размера, такие как «cygnus» или «magnum».

Чтобы отметить начало слова введите < , введите > чтобы отметить конец слова:

Например, для поиска слова «foo» вы должны использовать:

:s//bar/

История замены

Vim отслеживает все команды, которые вы выполняете в текущем сеансе. Чтобы просмотреть историю предыдущих команд замены, введите :s и используйте клавиши со стрелками вверх/вниз, чтобы найти предыдущую операцию замены. Чтобы запустить команду, просто нажмите Enter . Вы также можете отредактировать команду перед выполнением операции.

Примеры

Строки комментариев (добавить # перед строкой) от 5 до 20:

:5,20s/^/#/

Раскомментируйте строки с 5 по 20, отмените предыдущие изменения:

:5,20s/^#//

Замените все экземпляры «яблоко», «апельсин» и «манго» на «фрукты»:

:%s/apple|orange|mango/fruit/g

Удалите завершающие пробелы в конце каждой строки:

:%s/s $//e

Добавить комментарий