В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13 |
Средства обработки структурированных данных
Идейно простым, но весьма мощным и полезным средством обработки текстовых файлов является служебная программа преобразования символов tr:
tr [-c | -C] [-s] цепочка1 цепочка2 tr -s [-c | -C] цепочка1 tr -d [-c | -C] цепочка1 tr -ds [-c | -C] цепочка1 цепочка2
Она не применяет регулярных выражений как таковых, но в цепочках - аргументах можно употреблять конструкции, аналогичные некоторым односимвольным РВ.
Утилита tr копирует стандартный ввод на стандартный вывод с заменой либо удалением выбранных символов. При отсутствии опций введенные символы, найденные в цепочке1, заменяются на соответствующие (стоящие на тех же относительных позициях) символы из цепочки2. Опции -c и -C предписывают использовать вместо цепочки1 ее дополнение до множества всех символов; в первом случае дополнение упорядочивается в соответствии с кодировкой, во втором - по алфавиту. По опции -d будут удалены все входные символы, заданные цепочкой1. Опция -s задает сжатие (до одного) последовательностей одинаковых символов, специфицированных последней из цепочек, указанных в командной строке ( сжатие производится после каждой замены и/или удаления).
Чтобы задавать в цепочках - аргументах утилиты tr группы символов, можно воспользоваться следующими конструкциями.
c1-c2
Обозначает цепочку символов, лежащих в диапазоне от c1 до c2 включительно.
[:класс_символов:]
Обозначает цепочку символов, принадлежащих указанному классу (см. выше описание базовых регулярных выражений ).
[=класс_эквивалентности=]
Обозначает цепочку символов, принадлежащих указанному классу эквивалентности при алфавитном сравнении.
[c*n]
Обозначает символ c, повторенный n раз. Может использоваться только в цепочке2. Если первая цифра в n есть 0, n рассматривается как восьмеричное число; иначе - как десятичное. Нулевое или отсутствующее n воспринимается как "очень много"; эта возможность полезна при дополнении цепочки2 до длины цепочки1.
Обратный слэш можно использовать для задания управляющих символов ( '\\', '\a', '\b', '\f', '\n', '\r', '\t', '\v' ). Кроме того, \ обозначает код символа, если за ним идут одна, две или три восьмеричные цифры.
Следующая команда (см. листинг 6.36) помещает список всех слов из файла f1, по одному на строку, в файл f2 (под словом понимается максимальная последовательность букв).
tr -cs '[:alpha:]' '[\n*]' < f1 > f2Листинг 6.36. Пример использования служебной программы tr.
Команда, показанная в листинге 6.37, переводит большие буквы в малые, попутно сжимая последовательности одинаковых (без учета регистра) букв.
tr -s '[:upper:]' '[:lower:]'Листинг 6.37. Пример трансляции и сжатия последовательностей символов с использованием служебной программы tr.
uniq [-c | -d | -u] [-f число] [-s число] [входной_файл [выходной_файл]]
позволяет сократить до одной подряд идущие одинаковые строки (сделать одинаковые строки файла смежными можно с помощью утилиты sort ). Опции предоставляют дополнительный сервис.
-c
Перед каждой выходной строкой помещать ее кратность во входном файле.
-d
Подавить вывод неповторяющихся строк.
-f число
При сравнении строк игнорировать заданное число начальных полей. Поле определяется как максимальная цепочка символов, успешно сопоставляемая с базовым регулярным выражением [[:blank:]]*[^[:blank:]]* .
-s число
При сравнении строк игнорировать заданное число начальных символов. При совместном использовании опций -f и -c игнорируется указанное число символов, идущих после заданного числа полей.
-u
Подавить вывод строк, повторявшихся во входном файле.
В качестве примера употребления утилиты uniq приведем конвейер, позволяющий найти десять самых употребительных заголовочных файлов среди включаемых в стандартные заголовочные файлы, расположенные в каталоге /usr/include и его подкаталогах (см. листинг 6.38). Результат работы конвейера может выглядеть так, как показано в листинге 6.39.
find /usr/include -name '*.h' -exec cat {} \; | tr -d '[:blank:]' | \ grep -E -e '^#include(<.*>|".*")' | sort | uniq -dc | sort -r | headЛистинг 6.38. Пример использования служебной программы uniq.
977 #include"nsISupports.h" 315 #include<glib.h> 201 #include<gdk/gdk.h> 167 #include<glibmm.h> 160 #include<features.h> 154 #include<glib-object.h> 144 #include"nsCOMPtr.h" 139 #include<sys/types.h> 139 #include<glibmm/class.h> 135 #include"nscore.h"Листинг 6.39. Возможный результат работы конвейера, показанного в листинге 6.38.