Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Электронный офис в Linux

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).