В этой статье описывается, как найти и заменить текст в 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
после шаблона поиска. Например, /Linuxc
выполняет поиск без учета регистра.
Если вы изменили настройку регистра по умолчанию и хотите выполнять поиск с учетом регистра, используйте флаг 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» вы должны использовать <foo>
:
:s/<foo>/bar/
История замены
Vim отслеживает все команды, которые вы выполняете в текущем сеансе. Чтобы просмотреть историю предыдущих заменяющих команд, введите :s
и используйте клавиши со стрелками вверх / вниз, чтобы найти предыдущую заменяющую операцию. Чтобы запустить команду, просто нажмите Enter
. Вы также можете отредактировать команду перед выполнением операции.
Примеры
Строки комментариев (добавьте #
перед строкой) от 5 до 20:
:5,20s/^/#/
Раскомментируйте строки с 5 по 20, отмените предыдущие изменения:
:5,20s/^#//
Замените все экземпляры «яблоко», «апельсин» и «манго» на «фрукты»:
:%s/apple|orange|mango/fruit/g
Удалите завершающие пробелы в конце каждой строки:
:%s/s+$//e
Вывод
Поиск и замена — это мощная функция Vim, которая позволяет быстро вносить изменения в текст.
Не стесняйтесь оставлять комментарии, если у вас есть вопросы.