12.1. Применение утилиты tr
Утилита tr выполняет символьное преобразование путем подстановки или удаления символов из стандартного входного потока. Она часто применяется для удаления управляющих символов из файла или преобразования регистра символов. Как правило, утилите tr передаются две строки: первая строка содержит искомые символы, а вторая — те, на которые их следует заменить. При запуске команды устанавливается соответствие между символами обеих строк, а затем начинается преобразование.
В этой главе рассматриваются следующие темы:
• преобразование строчных символов в прописные;
• очистка содержимого файлов от управляющих символов;
• удаление пустых строк.
Формат утилиты tr с наиболее часто применяемыми параметрами таков:
tr -c -d -s ["строка1"] ["строка2"] входной_файл
где
-c Задает замену набора символов, указанных в строке1 их собственным дополнением при условии, что значение этих символов находится в диапазоне значений кодов ASCII -d Задает удаление во входном файле всех символов, указанных в строке1
-s Задает удаление в последовательности повторяющихся символов всех символов, кроме первого, благодаря чему удаляются повторяющиеся символы
Параметр входной_файл определяет имя файла, содержимое которого необходимо преобразовать. Несмотря на то, что входные данные могут иметь и другие формы, широко используется именно указанный выше способ их задания.
12.1.1. Диапазоны символов
При использовании утилиты tr можно указать диапазоны или списки символов в виде шаблонов, которые образованы строками. Эти шаблоны подобны регулярным выражениям, однако на самом деле они таковыми не являются. При указании в утилите tr содержимого строк строка1 или строка2 используются только диапазоны и последовательности символов либо отдельные символы.
[a‑z]
Строка символов, находящихся в диапазоне a‑z
[A‑Z]
Строка символов, находящихся в диапазоне A‑Z
[0-9]
Строка чисел
/octal
Восьмеричное число, состоящее из трех чисел и представляющее любой действительный символ в коде ASCII
[0*n]
Означает символ '0', встречающийся столько раз, сколько указывает значение 'n'. Таким образом, [0*2] означает 00, причем в любой строке, включая и 00
В большинстве вариантов утилиты tr поддерживаются классы символов и сокращенная запись управляющих символов. В формат класса символов [:class:] среди прочего входят следующие обозначения: alnum (буквенно–цифровые символы), alpha (буквы), blank (пропуски), upper (прописные буквы), lower (строчные буквы), cntrl (управляющие символы), space (пробелы), digit (цифры), graph (графические символы) и т. д. В табл. 12.1 представлен способ сокращенного представления некоторых наиболее распространенных управляющих символов, используемый вместо восьмеричного их представления в виде трех чисел, которое также приведено в данной таблице.
Таблица 12.1. Различные способы указания управляющих символов в утилите tr
Сокращение
Значение
Восмеричное значение
\а
Control‑G — звонок
\007
\b
Control‑H — клавиша возврата на одну позицию
\010
\f
Control‑L — прокрутка страницы
\014
\n
Comrol‑J — новая строка
\012
\r
Control‑M — клавиша возврата каретки
\015
\t
Control‑I — клавиша табуляции
\011
\v
Control‑X
\030
При замене строки или диапазона символов одним символом следует иметь в виду, что этот символ не указывается в квадратных скобках ([]). В некоторых системах допускается применение квадратных скобок, причем в данном случае можно для указания символа новой строки воспользоваться шаблоном ["\0l2"] или "\012". Утилита tr не предъявляет строгих требований к виду кавычек. Поэтому не следует удивляться, если эта утилита действует даже в том случае, если вместо одинарных кавычек используются двойные кавычки.
Подобно большинству системных инструментальных средств, утилита tr восприимчива к специальным символам. Поэтому если требуется выполнить сопоставление с одним из таких символов, следует предварительно отделить этот символ обратной косой чертой. Например, для указания левой фигурной скобки ({) необходимо ввести \{ для отмены специального значения фигурной скобки.
12.1.2. Сохранение выходного результата
Если нужно сохранить полученные результаты, следует переадресовать их в файл. В приведенном ниже примере выходной результат перенаправляется в файл с именем results.txt. В качестве входного используется файл oops.txt.
$ tr -s "[a‑z]" < oops.txt > results.txt
Обратимся к некоторым примерам использования рассматриваемой команды.
12.1.3. Устранение повторяющихся символов
Если проанализировать приведенный ниже файл, можно обнаружить некоторые опечатки. Разумеется, допустить опечатки легко — вспомните, сколько раз во время работы в редакторе vi вы случайно нажимали не те клавиши.
$ pg oops.txt
And the cowwwwws went homeeeeeeee Or did theyyyy
Если нужно избавиться от повторяющихся букв или сократить число подобных букв до одной, можно воспользоваться параметром ' -s'. Также можно воспользоваться шаблоном [a‑z], поскольку в данном случае все символы являются буквенными. При этом входной файл перенаправляется команде tr.
$ tr -s "[a‑z]"< oops.txt
And the cows went home Or did they
Все повторяющиеся символы устраняются. При необходимости файл oops.txt можно перенаправить с помощью команды cat. Результат будет тот же.
$ cat oops.txt | tr -s "[a‑z]"
And the cows went home Or did they
12.1.4. Удаление пустых строк
Для удаления пустых строк их следует просто "вытеснить" из файла. Ниже приведен файл с именем plane.txt, содержащий ряд пустых строк.
$ pg plane.txt
987932 Spitfire
190992 Lancaster
238991 Typhoon
В данном случае применяется параметр ' -s', который приводит к удалению пустых строк. Также используется восьмеричное значение для символа новой строки \012. Ниже приведена соответствующая команда.
$ tr -s "[\012]" < plane.txt
987932 Spitfire
190992 Lancaster
238991 Typhoon
С другой стороны, можно воспользоваться сокращенной записью символа новой строки ' \n'. Можно применять как одинарные, так и двойные кавычки, хотя обычно используются двойные кавычки.
$ tr -s "[\n]" < plane.txt
987932 Spitfire
190992 Lancaster
238991 Typhoon
12.1.5. Преобразование прописных букв в строчные
Изменение регистра символов является наряду с процедурой удаления управляющих символов одним из наиболее распространенных случаев применения утилиты tr. Чтобы выполнить подобное преобразование, достаточно указать шаблон строчных букв '[a‑z]' для входных данных и шаблон прописных букв '[A‑Z]' для выходных преобразованных данных.