Трудное дело — чихать с чувством собственного достоинства (Ласло Фелеки).

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

14.01.2021
Последнее руководство для начинающих по Vim

В этой статье описывается, как найти и заменить текст в Vim/Vi.

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

 

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

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

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

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

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

 

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

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

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

:s/foo/bar/

 

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

:s/foo/bar/g

 

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

:%s/foo/bar/g

 

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

:s/foo//g

 

Читать  Использование команды alias в Linux для повышения вашей эффективности

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

: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 после шаблона поиска. Например, /Linux\c выполняет поиск без учета регистра.

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

:s/foo/bar/gi

 

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

 

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

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

Читать  Как установить и использовать PHP Composer в Debian 10

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

Например, чтобы заменить все вхождения ‘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. Вы также можете отредактировать команду перед выполнением операции.

Читать  Официально выпущена среда рабочего стола GNOME 41, что нового

 

Примеры

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

:5,20s/^/#/

 

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

:5,20s/^#//

 

Замените все экземпляры «apple», «orange» и «mango» на «fruit»:

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

 

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

:%s/\s\+$//e

 

Заключение

Поиск и замена — это мощная функция Vim, которая позволяет быстро вносить изменения в текст.

Не стесняйтесь оставлять комментарии, если у вас есть вопросы.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (3 оценок, среднее: 5,00 из 5)
Загрузка...
Если статья понравилась, то поделитесь ей в социальных сетях:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Это может быть вам интересно


Загрузка...

Спасибо!

Теперь редакторы в курсе.

Scroll to Top