Вперед Назад Содержание

9. Обработка символов

Эти утилиты оперируют отдельными символами.

9.1 `tr': преобразование, сжатие, и/или удаление символов

Общая запись:

tr [OPTION]... SET1 [SET2]
Утилита `tr' сопирует стандартный ввод в стандартный вывод, выввполняя одну из следующих операций: Аргументы SET1 и (если указан) SET2 задают упорядоченные множества символов. Эти множества содержат символы, которыми оперирует `tr'. Опция `--complement' (`-c') заменяет SET1 на его дополнение (все символы не содержащиеся в SET1).

9.2 Задание множества симвлов

Формат аргументов SET1 и SET2 напоминает формат регулярного выражения, однако, это не регулярные выражения, а просто списки символов. Символы можно задать просто перечисляя их, но, для удобства можно использовать сокращения,описанные ниже. Некоторые из них можно использовать только в SET1 или SET2, как указанно далее.

Запись с предстоящей '\'.

Запись в виде '\' с последующим символом не указанным ниже является ошибочной.

Промежутки.

Запись `M-N' обозначает все символоы от M до N, в порядке возрастания. При чем M при упорядочивании должно стоять перед N; иначе, произойжет ошибка. Например, `0-9' то же самое, что и `0123456789'. Хотя GNU утилита `tr' не поддерживает синтаксис System V, в котором запись промежутков заключаются в квадратные скобки. Преобразования символов заданные в этом формате успешно выполняются, только если квадратным скобкам в SET1 соответствуют квадратные скобки в SET2.

Повторение символов.

Запись `[C*N]' в SET2 обозначает N повторений символа C. T.е., `[y*6]' то же самое, что `yyyyyy'. А запись `[C*]' в SET2 обозначает столько копий символа C, сколько необходимо чтобы сделать SET2 такой же длины как SET1. Если N начинается с `0', оно интерпретируется в восьмеричной, иначе в десятичной системе.

Классы символов.

Запись `[:CLASS:]' обозначает все символы из (предопределенного) класса CLASS. Символы рассматриваются в нестрогом порядке, кроме классов `upper' и `lower', которые рассматриваются в порядке возрастания. Если заданы две опции `--delete' (`-d') и `--squeeze-repeats' (`-s'), то в SET2 можно задать любой класс символов. Иначе, в SET2 можно указывать только классы 'lower' и `upper', и только, если соответстиующий класс (`upper' или `lower', соответственно) задан в той же относительной позиции в SET1. Названия классов приводятся ниже. Если название класса задано неправильно, то произойдет ошибка.

нестрогом порядке. Классы эквивалентности были введены относительно недавно для поддержки не-английских алфавитов. Но, похоже, не существует стандартного способа их задания. По этому, эти классы не полностью реализованны в GNU утилите `tr'; каджый класс эквивалентности состоит только из неособенных символов.

Преобразования

Утилита `tr' производит преобразование символов только если заданны SET1 и SET2, и не указана опция `--delete' (`-d'). `tr' преобразует каждый входной символ представленный в SET1 в соответствующий символ из SET2. Символы не представленные в SET1 не изменяются. Если символ представлен в SET1 больше одного раза, а соответствующие символы из SET2 не идентичны, используется только последний. например следующие две команды эквивалентны:

tr aaa xyz tr a z
Чаще всего `tr' используется для преобразования символов нижнего регистра в символы верхнего регистра. Это можно сделать несколькими способами. Вот три примера:
tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ tr a-z A-Z tr '[:lower:]' '[:upper:]'
При преобразовании символов, SET1 и SET2 обычно имеют одинаковую длину. Если SET1 короче чем SET2, лишние символы из SET2 игнорируются.

С другой стороны, если SET1 длиннее чем SET2, то согласно POSIX.2 результат не определен. В этой ситуации, BSD утилита `tr' наращивает SET2 до дилны SET1 повторением последнего символа из SET2. System V утилита `tr' урезает SET1 до длины SET2.

По умолчанию, GNU утилита `tr' обрабатывает этот случай так же как BSD утилита `tr'. Если задана опция `--truncate-set1' (`-t'), GNU утилита `tr' обрабатывает этот случай так же как System V утилита `tr'. Эта опция игнорируется при выполнении других операций.

Например, эффективная для BSD запись бесполезна для System V утилиты `tr':

tr -cs A-Za-z0-9 '\012'
потому что она преобразует только нулевые байты (первый элемент дополнения множества SET1), вместо всех букв и цифр, в символы перевода строки.

Сжатие повторений и удаление

Если задана только опция `--delete' (`-d'), `tr' удаляет все входные символы встречающиеся в списке SET1.

Если задана только опция `--squeeze-repeats' (`-s'), `tr' заменяет последовательность одинаковых символов на один такой символ, если он указан в списке SET1.

Если заданы обе опции `--delete' и `--squeeze-repeats', `tr' сначала производит удаление используя SET1, и потом сжимает последовательности повторяющихся символов используя SET2.

Опцию `--squeeze-repeats' так же можно использовать, при преобразовании символов, для сжатия оставшихся повторяющихся символов испльзуя SET2.

Здесь представлены нсколько примеров иллюстрирующих различные комбинации опций:

Удаление всех нулевых байт:

tr -d '\000'

Размещение каждого слова в отдельную строку, преобразованием всех не-букв и не-цифр в символы перевода строки и сжиманием полученных последовательностей повторяющихся символов перевода сроки в одиночный символ:

tr -cs '[a-zA-Z0-9]' '[\n*]'
Преобразование последовательностей повторяющихся символов перевода сроки в одиночные символы:
tr -s '\n'

Предупреждающие сообщения

Установка shell-переменной `POSIXLY_CORRECT' отключает вывод предупреждающих сообщений, для точного соответствия стандарту POSIX.2. Иначе, они выводятся в следующих случаях:

9.3 `expand': преобразование табуляции в пробелы

Утилита `expand' последовательно считывает файлы, указанные в качестве аргументов FILE, и выводит их содержимое в стандартный вывод, заменяя табуляцию на пробелы. Если имя файла не указано, или в качестве одного из аргументов задан минус '-', `expand' считывает данные из стандартного ввода.

Общая запись:

expand [OPTION]... [FILE]...
По умолчанию, `expand' преборазует все табуляции в пробелы. Она сохраняет символы 'забой' для вывода, эти символы уменьшают счетчик используемый для вычисления табуляций. Табуляция, по умолчанию, занимет 8 позиций.

Утилита воспринимает следующие опции (см. так же главу 2 'Общие Опции'):

`-TAB1[,TAB2]...' или `-t TAB1[,TAB2]...' или `--tabs=TAB1[,TAB2]...'

Если задано только TAB1, то позиции табуляции разделяются TAB1 пробелами (по умолчанию 8). Иначе, табуляции устанавливаются в позициях TAB1, TAB2, ... (пронумерованных начиная с 0), и каждая табуляция стоящая после заданной последней позиции табуляции заменяется на один пробел. Если позиции табуляции заданны в опциях `-t' и `--tabs', их можно записывать как через запятую, так и через пробел.

`-i' или `--initial'

Преобразует в пробелы только начальные табуляции (которым не предшествуют пробелы или другие табуляции) каждой строки.

9.4 `unexpand': преобразует пробелы в табуляции

Утилита `unexpand' последовательно считывает файлы, указанные в качестве аргументов FILE, и выводит их содержимое в стандартный вывод, заменяя последовательные табуляции и пробелы на табуляции. Если имя файла не указано, или в качестве одного из аргументов задан минус '-', `unexpand' считывает данные из стандартного ввода.

Общая запись:

unexpand [OPTION]... [FILE]...
По уолчаню, `unexpand' преобразует только начальные пробелы и табуляции (перед котрыми нет других пробелов и табуляций) каждой строки. Она сохраняет символы 'забой' для вывода, эти символы уменьшают счетчик используемый для вычисления табуляций. Табуляция, по умолчанию, занимет 8 позиций.

Утилита воспринимает следующие опции (см. так же главу 2 'Общие Опции'):

`-TAB1[,TAB2]...' или `-t TAB1[,TAB2]...' или `--tabs=TAB1[,TAB2]...'

Если задано только TAB1, то позиции табуляции разделяются TAB1 пробелами, вместо 8 по умолчанию. Иначе, табуляции устанавливаются в позициях TAB1, TAB2, ... (пронумерованных начиная с 0), и все табуляции и лробелы стоящие после заданной последней позиции табуляции не изменяются. Если позиции табуляции заданны в опциях `-t' и `--tabs', их можно записывать через пробел. Эта опция автоматически подразумевает опцию `-a'.

`-a' или `--all'

Преобразует наборы из двух или более пробелов или табуляций, исключая начальные, в табуляции.


Вперед Назад Содержание