7.20 tr - перекодировка и уплотнение последовательностей символов contents

Подраздел


7.20 tr - перекодировка и уплотнение последовательностей символов

Использование программы:
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 (усечение выполняется с правого края строки).

7.20.1 Наборы символов

Формат значений параметров 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 и т.д.

Все рассуждения, которые относятся к способу изображения символов, верны только для знаков латинского алфавита.

7.20.2 Перекодировка (трансляция) символов

Программа 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

7.20.3 Простые примеры

".

head T | tr -cs A-Za-z0-9 '12'

head T | tr -tcs A-Za-z0-9 '12'

В первом случае мы получим

subsection

а результатом второй строки будет

subsection{Простые примеры}

В первой строке восьмеричная кодовая комбинация LF расширена до размеров A-Za-z0-9, все символы не совпадающие с A-Za-z0-9 перекодированы в <LF> (в данном случае все специальные знаки и символы Кириллицы), из выводного потока удалены идущие подряд символы <LF>.

Во втором случае первый параметр set1 усечен до одного символа (до длины set2), а первым символом является восьмеричный код 000. Поскольку в вводном файле не было символа с кодом 000, то мы и не видим изменений.

7.20.4 Уплотнение и удаление символов

Уплотнение символов подразумевает, что программа tr заменяет любые два и более одинаковых символа на один символ. Например, заменить все повторяющиеся переводы строк на один перевод строки:
SPMquottr -s ''"

Удалить все символы с восьмеричным кодом 000:
SPMquottr -d '00'"

Преобразовать все знаки кроме букв и цифр в знаки <LF> и ужать повторяющиеся знаки <LF>:
SPMquottr -cs '[a-zA-Z0-9]' '[]'"

7.20.5 Диагностические сообщения

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


contents
Обновлено: 16.03.2015