:%s/строка/Строка/gc
Эта команда вернет содержимое файла в прежнее состояние, но перед каждой заменой vi будет останавливаться и спрашивать подтверждение, выдавая следующее сообщение:
заменить на Строка? (y/n/a/q/l/^E/^Y)
В круглых скобках перечислены возможные варианты ответов, описание которых приводится в табл. 12.6.
Таблица 12.6. Клавиши подтверждения замены
Клавиша
Действие
y
Выполнить замену
n
Пропустить найденное вхождение
a
Выполнить замену этого и всех последующих вхождений
q или ESC
Завершить операцию
l
Выполнить замену этого вхождения и завершить операцию. Сокращенно от last (последняя)
CTRL+E, CTRL+Y
Прокрутить вниз или вверх соответственно. Эти команды удобно использовать для просмотра контекста найденного вхождения перед заменой
Редактирование нескольких файлов
Иногда бывает необходимо редактировать сразу несколько файлов. Например, может понадобиться внести изменения в файлы или скопировать содержимое из одного файла в другой. Редактор vi позволяет открыть несколько файлов, перечислив их в командной строке:
vi файл1 файл2 файл3...
Давайте закроем текущий сеанс работы vi и создадим новый файл для редактирования. Введите :wq, чтобы выйти из vi с сохранением изменений в тексте. Далее, создайте новый файл в домашнем каталоге, который мы будем использовать в наших экспериментах. Создайте файл, захватив в него вывод команды ls:
[[email protected] ~]$ ls -l /usr/bin > ls-output.txt
Теперь откройте в vi старый и новый файлы:
[[email protected] ~]$ vi foo.txt ls-output.txt
После запуска vi вы увидите на экране первый файл:
Съешь же ещё этих мягких французских булок, да выпей чаю. Это классно.
Строка 2
Строка 3
Строка 4
Строка 5
Переключение между файлами
Чтобы переключиться с одного файла на следующий, выполните ex-команду:
:n
Чтобы вернуться обратно, в предыдущий файл, выполните:
:N
Теперь мы можем переключаться между файлами, но vi проводит политику, запрещающую переключаться между файлами, если в текущем файле имеются несохраненные изменения. Чтобы заставить vi переключиться между файлами с потерей всех несохраненных изменений, добавьте в команду восклицательный знак (!).
В дополнение к методам переключения между файлами, описанным выше, vim (и некоторые версии vi) предоставляет дополнительные ex-команды, упрощающие управление множеством файлов. Например, командой :buffers можно вывести список редактируемых файлов. В этом случае список появляется в нижней части экрана:
:buffers
1 %a "foo.txt" line 1
2 "ls-output.txt" line 0
Нажмите ENTER или введите команду для продолжения
Чтобы перейти к другому буферу (файлу), введите :buffer и номер искомого буфера. Например, переключиться с буфера 1, содержащего файл foo.txt, на буфер 2, содержащий файл ls-output.txt, можно командой:
:buffer 2
после выполнения этой команды на экране появится второй файл.
Открытие дополнительных файлов для редактирования
Также существует возможность добавлять файлы в текущий сеанс редактирования. Команда :e (сокращенно от edit — редактировать) с именем файла откроет дополнительный файл. Завершите текущий сеанс редактирования и вернитесь в командную строку.
Запустите vi снова, но на этот раз с единственным файлом:
[[email protected] ~]$ vi foo.txt
Чтобы добавить второй файл, введите:
:e ls-output.txt
и на экране должен появиться второй файл. Первый файл останется открытым в редакторе, в чем легко убедиться:
:buffers
1 # "foo.txt" line 1
2 %a "ls-output.txt" line 0
Нажмите ENTER или введите команду для продолжения
ПРИМЕЧАНИЕ
Файлы, открытые командой :e, недоступны для команд :n и :N. Чтобы переключиться на такие файлы, используйте команду :buffer с номером буфера.
Копирование содержимого из одного файла в другой
Часто в процессе редактирования множества файлов бывает необходимо скопировать фрагмент текста из одного файла в другой. Это легко сделать с помощью обычных команд копирования и вставки, представленных выше. Посмотрим, как можно это осуществить. Сначала, в случае с использованием двух наших файлов, переключитесь на буфер 1 (foo.txt), выполнив команду:
:buffer 1
В результате на экране должно появиться следующее:
Съешь же ещё этих мягких французских булок, да выпей чаю. Это классно.
Строка 2
Строка 3
Строка 4
Строка 5
Далее переместите курсор на первую строку и введите yy, чтобы скопировать строку.
Переключитесь на второй буфер командой:
:buffer 2
Теперь на экране должен появиться некий список файлов (здесь показана только часть):
343700
-rwxr-xr-x 1 root root 31316 2011-12-05 08:58 [
-rwxr-xr-x 1 root root 8240 2011-12-09 13:39 411toppm
-rwxr-xr-x 1 root root 111276 2012-01-31 13:36 a2p
-rwxr-xr-x 1 root root 25368 2010-10-06 20:16 a52dec
-rwxr-xr-x 1 root root 11532 2011-05-04 17:43 aafire
-rwxr-xr-x 1 root root 7292 2011-05-04 17:43 aainfo
Переместите курсор на первую строку и вставьте строку, скопированную в предыдущем файле, введя команду p:
343700
Съешь же ещё этих мягких французских булок, да выпей чаю. Это классно..
-rwxr-xr-x 1 root root 31316 2011-12-05 08:58 [
-rwxr-xr-x 1 root root 8240 2011-12-09 13:39 411toppm
-rwxr-xr-x 1 root root 111276 2012-01-31 13:36 a2p
-rwxr-xr-x 1 root root 25368 2010-10-06 20:16 a52dec
-rwxr-xr-x 1 root root 11532 2011-05-04 17:43 aafire
-rwxr-xr-x 1 root root 7292 2011-05-04 17:43 aainfo
Вставка целого файла в другой файл
Кроме того, мы можем вставить файл целиком в другой файл. Для выполнения этого приема завершите сеанс vi и запустите новый, с одним файлом:
[[email protected] ~]$ vi ls-output.txt
На экране снова появится список файлов:
343700
-rwxr-xr-x 1 root root 31316 2011-12-05 08:58 [
-rwxr-xr-x 1 root root 8240 2011-12-09 13:39 411toppm
-rwxr-xr-x 1 root root 111276 2012-01-31 13:36 a2p
-rwxr-xr-x 1 root root 25368 2010-10-06 20:16 a52dec
-rwxr-xr-x 1 root root 11532 2011-05-04 17:43 aafire
-rwxr-xr-x 1 root root 7292 2011-05-04 17:43 aainfo
Переместите курсор в третью строку и введите следующую ex-команду:
:r foo.txt
Команда :r (сокращенно от read — читать) вставит указанный файл перед позицией курсора. Теперь экран должен выглядеть так:
343700
-rwxr-xr-x 1 root root 31316 2011-12-05 08:58 [
-rwxr-xr-x 1 root root 8240 2011-12-09 13:39 411toppm
Съешь же ещё этих мягких французских булок, да выпей чаю. Это классно.
Строка 2
Строка 3
Строка 4
Строка 5
-rwxr-xr-x 1 root root 111276 2012-01-31 13:36 a2p
-rwxr-xr-x 1 root root 25368 2010-10-06 20:16 a52dec
-rwxr-xr-x 1 root root 11532 2011-05-04 17:43 aafire
-rwxr-xr-x 1 root root 7292 2011-05-04 17:43 aainfo
Сохранение результатов работы
И здесь vi предлагает нам несколько способов сохранения отредактированных файлов. Мы уже знакомы с ex-командой :w, но существуют и другие команды, которые могут оказаться полезными.