tr — перекодирование или удаление символов

Программа tr используется для перекодирования символов. Ее можно рассматривать как своеобразную посимвольную операцию поиска с заменой. Перекодирование — это процесс замены символов из одного алфавита символами из другого алфавита. Например, преобразование символов из нижнего регистра в верхний — это перекодирование. Такое преобразование можно выполнить с помощью tr:

[me@linuxbox ~]$ echo "lowercase letters" | tr a-z A-Z

LOWERCASE LETTERS

Как видите, tr принимает исходные данные со стандартного ввода и выводит результаты в стандартный вывод. tr принимает два аргумента: множество символов, подлежащих преобразованию, и соответствующее множество символов, в которые должны превратиться преобразуемые символы. Множества символов можно выразить тремя способами:

• в виде списка-перечисления, например ABCDEFGHIJKLMNOPQRSTUVWXYZ;

• в виде диапазона символов, например A-Z. Обратите внимание, что этому способу сопутствуют те же проблемы, что наблюдаются в других программах (из-за разного порядка алфавитной сортировки в разных регионах), и потому он должен использоваться с осторожностью;

• в виде классов символов POSIX, например [:upper:].

В большинстве случаев множества символов должны иметь одинаковую длину; что вполне допустимо в случае, если первое множество оказывается больше второго. Это может пригодиться, например, если существует необходимость преобразования нескольких символов в один:

[me@linuxbox ~]$ echo "lowercase letters" | tr [:lower:] A

AAAAAAAAA AAAAAAA

Кроме перекодирования tr позволяет просто удалять символы из входного потока. Выше в этой главе мы обсуждали проблему преобразования текстовых файлов в формате MS-DOS в текст в формате Unix. Для такого преобразования достаточно просто удалить символы возврата каретки в конце каждой строки. Эту операцию можно выполнить с помощью tr:

tr -d ' ' < файл_dos > файл_unix

где файл_dos — это файл, подлежащий преобразованию, а файл_unix — результат. В этой форме команды используется экранированная последовательность , представляющая символ возврата каретки. Чтобы увидеть полный список последовательностей и классов символов, поддерживаемых программой tr, попробуйте

[me@linuxbox ~]$ 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), или удаляет повторяющиеся экземпляры символов:

[me@linuxbox ~]$ echo "aaabbbccc" | tr -s ab

abccc

Здесь у нас имеется строка с повторяющимися символами. Передав множество ab команде tr, мы удалили повторяющиеся экземпляры символов, входящие в множество, при этом остальные символы (c), отсутствующие в множестве, остались нетронутыми. Обратите внимание, что повторяющиеся символы должны следовать подряд. В противном случае сжатие не даст никакого эффекта:

[me@linuxbox ~]$ echo "abcabcabc" | tr -s ab

abcabcabc