Как найти и заменить в Vim/Vi (Найти и заменить)

12 set 2022 3 min di lettura
Как найти и заменить в Vim/Vi (Найти и заменить)
Indice dei contenuti

Введение

В этой статье описывается, как найти и заменить текст в 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, позволяющая быстро вносить изменения в текст.

Buy me a coffeeBuy me a coffee

Supportaci se ti piacciono i nostri contenuti. Grazie.

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.