Получив diff-файл, его можно применить к старому файлу, чтобы получить новый:
patch < diff_файл
Продемонстрируем это на примере нашего тестового файла:
[[email protected] ~]$ diff -Naur file1.txt file2.txt > patchfile.txt
[[email protected] ~]$ patch < patchfile.txt
patching file file1.txt
[[email protected] ~]$ cat file1.txt
b
c
d
e
В этом примере мы создали diff-файл с именем patchfile.txt и затем воспользовались программой patch, чтобы применить его (наложить «заплату»). Обратите внимание, что нам не пришлось указывать целевой файл, потому что diff-файл (в унифицированном формате) уже содержит имена файлов в заголовке. После наложения «заплаты» содержимое file1.txt точно соответствует содержимому file2.txt.
Программа patch имеет большое число параметров, а кроме того, существует множество вспомогательных программ, которые помогут в правке «заплат» (diff-файлов).
Редактирование на лету
Наш опыт использования текстовых редакторов ограничивается в основном интерактивным способом их использования, в том смысле, что мы вручную перемещаем курсор в нужное место и затем вносим необходимые изменения. Однако существуют также неинтерактивные способы редактирования текста. Вполне возможно, например, применить серию изменений к множеству файлов всего одной командой.
tr — перекодирование или удаление символов
Программа tr используется для перекодирования символов. Ее можно рассматривать как своеобразную посимвольную операцию поиска с заменой. Перекодирование — это процесс замены символов из одного алфавита символами из другого алфавита. Например, преобразование символов из нижнего регистра в верхний — это перекодирование. Такое преобразование можно выполнить с помощью tr:
[[email protected] ~]$ echo "lowercase letters" | tr a-z A-Z
LOWERCASE LETTERS
Как видите, tr принимает исходные данные со стандартного ввода и выводит результаты в стандартный вывод. tr принимает два аргумента: множество символов, подлежащих преобразованию, и соответствующее множество символов, в которые должны превратиться преобразуемые символы. Множества символов можно выразить тремя способами:
• в виде списка-перечисления, например ABCDEFGHIJKLMNOPQRSTUVWXYZ;
• в виде диапазона символов, например A-Z. Обратите внимание, что этому способу сопутствуют те же проблемы, что наблюдаются в других программах (из-за разного порядка алфавитной сортировки в разных регионах), и потому он должен использоваться с осторожностью;
• в виде классов символов POSIX, например [:upper:].
В большинстве случаев множества символов должны иметь одинаковую длину; что вполне допустимо в случае, если первое множество оказывается больше второго. Это может пригодиться, например, если существует необходимость преобразования нескольких символов в один:
[[email protected] ~]$ echo "lowercase letters" | tr [:lower:] A
AAAAAAAAA AAAAAAA
Кроме перекодирования tr позволяет просто удалять символы из входного потока. Выше в этой главе мы обсуждали проблему преобразования текстовых файлов в формате MS-DOS в текст в формате Unix. Для такого преобразования достаточно просто удалить символы возврата каретки в конце каждой строки. Эту операцию можно выполнить с помощью tr:
tr -d 'r' < файл_dos > файл_unix
где файл_dos — это файл, подлежащий преобразованию, а файл_unix — результат. В этой форме команды используется экранированная последовательность r, представляющая символ возврата каретки. Чтобы увидеть полный список последовательностей и классов символов, поддерживаемых программой tr, попробуйте
[[email protected]inuxbox ~]$ tr --help
ROT13: не самый надежный способ шифрования
Одно забавное применение команды tr — шифрование текста по алгоритму ROT13. ROT13 — тривиальный тип шифрования, основанный на простом подстановочном шифре. Шифрованием назвать этот алгоритм можно только с большой натяжкой, скорее это алгоритм обфускации (запутывания) текста. Он используется иногда для запутывания потенциально уязвимого содержимого. Метод заключается в простом смещении каждого символа на 13 позиций далее по алфавиту. Так как число 13 соответствует середине набора из 26 символов, повторное применение алгоритма к тексту приводит к его восстановлению в исходное состояние. Шифрование с помощью tr выполняется, как показано ниже:
echo "secret text" | tr a-zA-Z n-za-mN-ZA-M
frperg grkg
Повторное применение той же процедуры приводит к обратному преобразованию:
echo "frperg grkg" | tr a-zA-Z n-za-mN-ZA-M
secret text
Многие программы для работы с электронной почтой и чтения новостей Usenet поддерживают шифрование ROT13. В Википедии можно найти замечательную статью по этой теме: http://ru.wikipedia.org/wiki/ROT13.
tr также позволяет выполнять и другие трюки. При вызове с параметром -s команда tr «сжимает» (squeeze), или удаляет повторяющиеся экземпляры символов:
[[email protected] ~]$ echo "aaabbbccc" | tr -s ab
abccc
Здесь у нас имеется строка с повторяющимися символами. Передав множество ab команде tr, мы удалили повторяющиеся экземпляры символов, входящие в множество, при этом остальные символы (c), отсутствующие в множестве, остались нетронутыми. Обратите внимание, что повторяющиеся символы должны следовать подряд. В противном случае сжатие не даст никакого эффекта:
[[email protected] ~]$ echo "abcabcabc" | tr -s ab
abcabcabc
sed — потоковый редактор для фильтрации и преобразования текста
Имя sed — это сокращенное словосочетание stream editor (потоковый редактор). Данная команда осуществляет редактирование потока текста, получаемого из множества файлов или подаваемого на стандартный ввод команды. sed — мощная и достаточно сложная программа (ей посвящены целые книги), поэтому здесь мы не будем рассматривать ее во всех подробностях.
В общем случае sed используется следующим образом: ей передается единственная команда редактирования (в командной строке) или имя файла сценария с множеством команд, и она применяет эти команды к каждой строке в потоке текста. Ниже приводится очень простой пример sed в действии:
[[email protected] ~]$ echo "front" | sed 's/front/back/'
back
В этом примере с помощью echo создается поток текста с единственным словом, который по конвейеру передается программе sed. sed, в свою очередь, применяет инструкцию s/front/back/ к тексту в потоке и выводит результат. Эта команда напоминает команду подстановки (поиск с заменой) в редакторе vi.
Команды sed начинаются с единственной буквы. В примере, рассмотренном выше, буква s представляет команду подстановки (substitution). За ней следуют искомая строка и строка замены, разделенные слешем. В качестве разделителя можно использовать любые символы. По общепринятому соглашению, чаще других используется символ слеша, но sed будет использовать в качестве разделителя любой символ, следующий сразу за командой. Ту же самую команду можно было бы записать иначе:
[[email protected] ~]$ echo "front" | sed 's_front_back_'
back
Символ подчеркивания, следующий сразу за командой, становится разделителем. Возможность употребления произвольных разделителей можно использовать для улучшения читаемости команд, как будет показано далее.
Большинству команд в sed может предшествовать адрес, который определяет, какие строки во входном потоке должны редактироваться. Если адрес отсутствует, команда редактирования применяется ко всем строкам во входном потоке. В простейшем случае адрес — это номер строки. Мы могли бы добавить единицу в наш пример: