Библиотека сайта rus-linux.net
vi. Некоторые интересные возможности
Автор: Владимир Царьковверсия статьи от 26.11.2009
Рассмотрим относительно сложные вопросы, решаемые с помощью vi (о том, как правильно произносить название этого текстового редактора, а также о наиболее простых операциях с текстом, читайте в ``vi. Курс молодого бойца'').
Работа с файлами в разных кодировках
Представим, что системная кодировка --- UTF-8, а нам нужно редактировать текст в KOI8-R. Если vi уже запущем, в командном режиме пишем:
:edit ++enc=koi8-r filename
где filename --- имя файла в KOI8-R. Такой же результат достигается из командной строки:
vi -c "edit ++enc=koi8-r filename"
Внимательный читатель, вероятно, догадался, что внутри кавычек может быть заключена любая команда, знакомая vi.
Интересным вариантом является использование программы iconv для преобразования кодировки файла в системную (к примеру, UTF-8), а потом направление текста на вход vi. Сделаем это следующим образом:
iconv -f KOI8-R -t UTF-8 filename | vi -
В данном случае, перекодирование filename осуществляется на лету и не сохраняется до тех пор, пока данное указание не поступит от vi.
Для выяснения того, какая кодировка символов используется в файле, применима программа enca.
Быстрое редактирование файла и групп файлов
Предположим, что у нас есть файл, в который необходимо быстро внести изменения. Заменить там какие-либо слова, например. Разумеется, решений такой задачи может быть множество. Однако, попробуем для этого использовать vi:
cat text | vi -c "%s/один/два/g" -c "wq! text" -
В указанном выше случае, мы прочитали файл под именем text с помощью программы cat, произвели средствами vi замену слова один на слово два и, сохранив изменения в файле, вернулись в командную оболочку.
А теперь представим, что в нашем распоряжении целый каталог файлов и нужно, внеся однообразные правки в их текст, записать результат в один единственный файл, а исходные файлы оставить без изменений. Читатель, думаю, догадался, что решить задачу можно следующим образом:
cat * | vi -c "%s/текст1/текст2/g" -c "wq result" -
Допустим, мы всё же решили править все подряд файлы каталога. Напишем небольшой shell-скрипт:
#!/bin/bash
find test -type f | while read FILENAME;
do cat $FILENAME | vi -c "%s/предложение номер 1/замена предложению 1/g" -c "wq! $FILENAME" -
done;
exit 0
Если скрипт не найдёт текста, который нужно заменить, в файл не будет внесено никаких изменений. Тем не менее, перед экспериментированием скопируйте важные файлы в безопасное место.
Для решения задачи по внесению более, чем одного изменения во все файлы каталога [заменить предложение msgstr "ИМЯ" на предложение msgstr "НАЗВАНИЕ", а также поменять запись {http://address} на (ftp://address)], немного доработаем наш скрипт:
#!/bin/bash
find test -type f | while read FILENAME;
do cat $FILENAME | vi -c "%s/msgstr \"ИМЯ\"/msgstr \"НАЗВАНИЕ\"/g" -c "%s@{http://адрес}@(ftp://аddress)@g" -c "wq! $FILENAME" -
done;
exit 0
В качестве разделителей у команды замены текста могут использоваться почти все неалфавитно-цифровые символы. Например: &, $, @. Подробнее см.: http://vim.wikia.com/wiki/Alternate_delimiters_for_the_replace_command.
В заключение отметим некоторые источники информации о работе с vi. Поиск и замена текста подробно рассмотрены в статье "Search and replace with vi": [часть 1], [a href="http://sunsite.uakom.sk/sunworldonline/swol-11-1997/swol-11-unix101.html">часть 2]. Большое количество полезных советов на русском языке опубликовано по адресу: http://www.net4me.ru/scripts/32/net50.html. Основным же источником информации о vi в Интернет, является сайт http://www.vim.org/ (пополняемый сборник подсказок по решению разных задач находится по адресу: http://vim.wikia.com/wiki/Main_Page).