Введение
В этой статье описывается, как найти и заменить текст в Vim/Vi.
Vim — самый популярный текстовый редактор командной строки. Он предустановлен в macOS и большинстве дистрибутивов Linux. Поиск и замена текста в Vim выполняется быстро и легко.
Найти и заменить
В Vim вы можете найти и заменить текст с помощью команды :substitute
replace ( :s
).
Чтобы запускать команды в Vim, вам нужно находиться в обычном режиме, режиме по умолчанию при запуске редактора. Чтобы вернуться в обычный режим из любого другого режима, просто нажмите клавишу « Esc ».
Общая форма команды замены выглядит следующим образом:
:[range]s/{pattern}/{string}/[flags] [count]
Команда ищет {pattern}
в каждой строке [range]
и заменяет его {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»:
:%s/^foo.*/Vim/gc
Символ ^
(вставка) соответствует началу строки, а .*
соответствует любому количеству символов.
Верхний и нижний регистр (чувствительность к регистру)
По умолчанию операция поиска чувствительна к регистру, поиск « FOO
» не будет соответствовать « Foo
».
Чтобы игнорировать регистр для строки поиска, используйте флаг i
:
:s/Foo/bar/gi
Другой способ игнорировать заглавные буквы — добавить \c
после шаблона поиска. Например, /Linux\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
" вы должны использовать \<foo\>
:
:s/\<foo\>/bar/
Заменить историю
Vim отслеживает все команды, выполненные в текущем сеансе. Чтобы просмотреть историю предыдущих команд замены, введите :s
и используйте клавиши со стрелками вверх/вниз, чтобы найти предыдущую операцию замены. Чтобы выполнить команду, просто нажмите Enter
. Вы также можете отредактировать команду перед выполнением операции.
Примеры
Строки комментариев (добавьте #
перед строкой) с 5
по 20
:
:5,20s/^/#/
20
строки 5
, отмените предыдущие изменения:
:5,20s/^#//
Замените все вхождения « mela
», « arancia
» и « mango
» на « frutta
»:
:%s/apple\|orange\|mango/fruit/g
Удалите конечные пробелы в конце каждой строки:
:%s/\s\+$//e
Вывод
Поиск и замена — мощная функция Vim, позволяющая быстро вносить изменения в текст.