Next: 7.21 Объединить строки из
Up: 7. Программы преобразования и
Previous: 7.19 cut - напечатать
Подраздел
Использование программы:
tr [option]... set1 [set2]
Программа tr копирует входной поток со стандартного устройства ввода
на стандартное устройство вывода производя при этом одно из преобразований:
- перекодировка символов и возможно уплотнение повторяющихся символов на
выводе;
- уплотнение повторяющихся символов (если встречается подряд два или
более одинаковых символа, программа заменяет их одним символом);
- удаление символов;
- удаление символов и уплотнение повторяющихся символов.
Значением параметра set1 (и, возможно, set2) являются строки
из
символов, которые подвергаются процессу обработки.
Программа воспринимает следующие значения поля option.
- -d
- -delete
- Удалить из входного потока те символы,
которые содержатся в строке
set1.
- -s
- -squeeze-repeats
- Когда используется только этот параметр, то программа заменяет одним
символом те
повторяющиеся символы, которые содержатся в строке set1.
Если используется комбинация параметров -delete и
-squeeze-repeats, то программа производит удаление
тех символов из входного потока, которые содержатся в set1, затем
производится выбрасывание тех повторяющихся символов, которые содержатся в
set2.
- -c
- -complement
- Использовать для операции те символы, которые не входят в строку set1.
- -t
- -truncate-set1
- Усечь строку set1 сделав е© равной по размеру строке set2
(усечение выполняется с правого края строки).
Формат значений параметров set1 и set2 повторяет формат
регулярных выражений (см. раздел 4.5), однако эти наборы не
являются регулярными выражениями, а являются последовательностями символов.
Большинство символов просто обозначают самих себя, но используются некоторые
комбинации, которые означают специальные символы. Некоторые комбинации
используются только в set1 и set2 как показано ниже.
Каждая специальная комбинация начинается обратным слешем (знак SPMquot
).
-
a
- Знак Control-G.
-
b
- Знак Control-H.
-
f
- Знак Control-L.
-
n
- Знак Control-J.
-
r
- Знак Control-M.
-
t
- Знак Control-I.
-
v
- Знак Control-K.
-
000
- Знак с восьмеричным кодовым представлением 000.
-
- Знак обратный слеш (
SPMquot
).
Если за обратным слешем будет следовать какой-то символ не указанный в
таблице, то возникнет ошибка.
- Интервалы.
- Обозначение m-k включает символы m и k и все символы между
ними. Первый символ должен быть ранее второго по алфавиту иначе возникнет
ошибка. Другой пример, запись 0-9 означает то же, что и 0123456789.
Заметим, что tr не поддерживает синтаксис, когда интервалы заключаются
в квадратные скобки.
- Повторяющиеся символы.
- Запись [C*n] в set2 означает, что символ C должен быть
повторен n раз. Так, запись [y*4] обозначает то же, что yyyy. Запись [C*] в set2 означает, что следует столько раз
повторить символ C, чтобы сделать длину set2 равной длине set1. Если n начинается с 0, то это воспринимается как восьмеричное
число, в противном случае - как десятичное.
- Классы символов.
- Запись [:class:] означает все символы из заранее определ©нного
класса class. Принадлежность классу не предполагает какого-либо
упорядочивания символов в классе, исключая классы upper и lower,
в которых символы упорядочены по возрастанию значений кодов.
Имена классов, которые понимает программа tr даны ниже.
- alnum
- Буквы и цифры.
- alpha
- Буквы.
- blank
- Пробел (по горизонтали).
- cntrl
- Управляющие символы.
- digit
- Цифры.
- graph
- Изображаемые символы (не включая пробел).
- lower
- Буквы на нижнем регистре.
- print
- Изображаемые символы (включая пробел).
- punct
- Символы знаков пунктуации.
- space
- Горизонтальный или вертикальный пробел.
- upper
- Буквы верхнего регистра.
- xdigit
- Шестнадцатеричные цифры.
- Классы эквивалентности.
- Запись [=C=] обозначает все символы, которые эквивалентны C в каком-то
смысле. Появление классов эквивалентности является относительно новым
намерением поддержать не английские алфавиты. Однако, по всей видимости, не
существует стандартного способа определить классы или их содержание. Поэтому
GNU tr не имеет полной реализации данных классов. Пока tr
поддерживает классы эквивалентности, в каждом из которых имеется одна буква.
Так, [=c=] означает c, а [=b=] означает b и т.д.
Все рассуждения, которые относятся к способу изображения символов, верны
только для знаков латинского алфавита.
Программа tr выполняет перекодировку в том случае, когда
присутствуют set1 и set2, но не присутствует параметр
-delete (-d). Программа читает водной поток символов и
перекодирует только те символы входного потока, которые находятся в строке
set1. Каждый символ входного потока, который присутствует в set1, перекодируется в соответствующий символ set2 (первый в
первый, второй во второй и т.п.). Если символ
входного потока не представлен в строке set1, то он переда©тся на
устройство стандартного вывода без изменений. Если любой символ
встречается в строке set1 дважды, то бер©тся последнее значение.
Например. нижеследующие две команды просто эквивалентны:
tr mmmm 1234
tr m 4
Привед©м пример различных вариантов перекодировки прописных букв в
строчные:
tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
tr a-z A-Z
tr '[:lower:]' '[:upper:]'
Все варианты эквивалентны.
Напомним, что это верно для латинского алфавита.
Когда происходит перекодировка, то строки set1 и set2 обычно
равны по длине. Если эти строки не равны по длине, то возникают
неоднозначности, которые могут интерпретироваться в различных версиях по
разному, т.е. о портабильности использования tr с параметрами set1 и set2 разной длины следует заботиться отдельно.
Конкретная программа GNU tr вед©т себя следующим образом:
- если set1 короче set2, то остаток set2 просто
игнорируется;
- если set1 длиннее set2, то по умолчанию tr
"растягивает" set2 до длины set1 пут©м дублирования
последнего символа set2 столько раз сколько необходимо.
- если set1 длиннее set2 и использован параметр -truncate-set1 (-t), то set1 будет усечена до длины set2. Этот параметр действует только для операции перекодировки.
Рассмотрим примеры работы программы tr. Пусть файл с именем T
содержит строку SPMquot
".
head T | tr -cs A-Za-z0-9 '\012'
head T | tr -tcs A-Za-z0-9 '\012'
В первом случае мы получим
subsection
а результатом второй строки будет
\subsection{Простые примеры}
В первой строке восьмеричная кодовая комбинация LF расширена до размеров
A-Za-z0-9, все символы не совпадающие с A-Za-z0-9
перекодированы в <LF> (в данном случае все специальные знаки и символы
Кириллицы), из
выводного потока удалены идущие подряд символы <LF>.
Во втором случае первый параметр set1 усечен до одного символа (до
длины set2), а первым символом является восьмеричный код 000.
Поскольку в вводном файле не было символа с кодом 000, то мы и не
видим изменений.
Уплотнение символов подразумевает, что программа tr заменяет любые
два и более одинаковых символа на один символ. Например, заменить все
повторяющиеся переводы строк на один перевод строки:
SPMquot
tr -s ''"
Удалить все символы с восьмеричным кодом 000:
SPMquot
tr -d '00'"
Преобразовать все знаки кроме букв и цифр в знаки <LF> и ужать
повторяющиеся знаки <LF>:
SPMquot
tr -cs '[a-zA-Z0-9]' '[]'"
В ряде случаев программа tr выда©т диагностические сообщения,
которые не оговорены стандартом POSIX. Чтобы избежать этих сообщений
следует установить переменную окружения POSIXLY_CORRECT.
Next: 7.21 Объединить строки из
Up: 7. Программы преобразования и
Previous: 7.19 cut - напечатать
Andrei Chevel
Andrei.Chevel@pnpi.spb.ru