Команда tr
проводит транслитерацию символов своего входного потока. Наиболее часто они используются для преобразования строчных букв в прописные и обратно:
$ tr a-z A-Z
Перевести строчные буквы в прописные
$ tr A-Z a-z
Перевести прописные буквы в строчные
Несколько отличается от всех рассмотренных выше команд dd
. Эта команда предназначена прежде всего для обработки данных на магнитной ленте, полученных из других систем — само ее название служит напоминанием о языке управлений заданиями OS/360. Команда dd
выполняет преобразование прописных букв в строчные, и наоборот (в нотации, отличной от нотации команды tr
). Она осуществляет перевод из множества символов ASCII в EBCDIC, и наоборот; может читать и писать данные в формате записей фиксированного размера с дополнением пробелами, что характерно для отличных от UNIX систем. На практике команду dd
часто используют для работы с исходными неотформатированными данными, откуда бы они ни были получены; она реализует набор средств для работы с двоичными данными.
Посмотрим, чего можно достичь с помощью взаимодействия фильтров на примере конвейера, который печатает 10 наиболее часто встречающихся во входном потоке слов:
cat $* |
tr -sc A-Za-z '\012' |
Сжимаем все небуквы в перевод строки
sort |
uniq -с |
sort -n |
tail |
5
Команда cat
собирает файлы, поскольку tr
может читать только стандартный входной поток. Команда tr
действует, как указано в справочном руководстве: она сжимает соседние, отличные от букв, символы в символы перевода строк, преобразуя таким образом входной поток в строки из одного слова. Затем слова сортируются и с помощью uniq -с
каждая группа идентичных слов сжимается в одну строку, начинающуюся со счетчика, который используется как сортируемое поле в команде sort -n
. (Эта последовательность двух команд сортировки, между которыми находится команда uniq, применяется так часто, что уже стала идиомой.) В результате получаются неповторяющиеся слова, отсортированные в порядке возрастания частоты появления в документе. Команда tail
отбирает 10 наиболее часто встречающихся слов (т.е. конец отсортированного файла) и команда 5
печатает их в пять столбцов.
Заметьте, кстати, что введение символа |
в конце строки — это законный способ ее продолжения.
Используя средства этого раздела и файл /usr/dict/words
, составьте простой анализатор правильности написания текста на английском языке. Каковы его недостатки и как их исправить?
Напишите программу подсчета слов на предпочитаемом вами языке программирования. Сравните ее размер, скорость и самодокументированность с соответствующим конвейером. Насколько легко вы можете преобразовать эту программу в программу проверки правильности написания текста?
4.3 Потоковый редактор sed
Вернемся теперь к редактору sed
. Поскольку он происходит непосредственно от ed
, вы легко изучите его и закрепите свои знания о редакторе ed
. Основа редактора sed
проста:
$ sed 'список команда ed' имена_файлов...
Читаются строки по одной из входных файлов; команды из списка применяются к каждой строке по одной в указанном порядке и результат редактирования записывается в стандартный выходной поток. Например, можно заменить в любом из указанных файлов UNIX
на UNIX (TM)
с помощью команды:
$ sed 's/\UNIX/\UNIX\ (TM)/g' имена_файлов...> выходной поток
Нужно правильно понимать действие команды. Она не изменяет содержимое своих входных файлов, а лишь пишет в стандартный выходной поток; исходные же файлы не изменяются. Вы уже достаточно разобрались в интерпретаторе, чтобы понять, что
$ sed '...' файл > файл
не лучшее решение: для замены содержимого файлов нужно задействовать временный файл или другую программу. В дальнейшем мы рассмотрим программу, реализующую задачу записи в существующий файл; обратитесь к команде overwrite
в (гл. 5).
Редактор sed
выдает все строки автоматически, поэтому команда p
не нужна после ввода команды замены, приведенной выше; более того, если она задается, то каждая изменяемая строка печатается дважды. Однако кавычки необходимы почти всегда, поскольку многие метасимволы программы sed
имеют специальные значения и для интерпретатора. Рассмотрим, например, команду du -а
, порождающую список имен файлов. Обычно она выдает размер и имя файла:
$ du -a ch4*
18 ch4.1
13 ch4.2
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии