Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:
$ pg diary.txt
Monday 10:50
Tuesday 15:30
Wednesday 15:30
Thursday 10:30
Friday 09.20
$ tr -cs "[a-z][A-Z]""[\Q12*]" < diary.txt
Monday
Tuesday
Wednesday
Thursday
Friday
12.1.8. Преобразование управляющих символов
Чаще всего утилита tr применяется для преобразования управляющих символов, особенно во время загрузки файлов из DOS в UNIX. Если в команде ftp не задан параметр, выполняющий преобразование символов возврата каретки в символы новой строки, обычно применяют утилиту tr.
Ниже приведен текстовый файл, при пересылке которого не было выполнено преобразование символов возврата каретки. Файл содержит часть требования на выдачу канцелярских принадлежностей. Управляющие символы файла отображены ниже с помощью команды cat -v.
$ cat -v stat.txt
Boxes рарег^^^^^^12^M
Clips metal^^^^^^^50^M
Pencils-medium^^^^^^10^M ^Z
В этом файле последовательность символов '^^^^^^' кодирует символы табуляции, каждая строка завершается управляющей последовательностью control-m, а в конце файла находится управляющая последовательность Control-Z. Ниже показано, как можно исправить положение.
В данном случае придется воспользоваться параметром '~s'. Если обратиться к таблице кодов ASCII, то восьмеричный код символа '^' равен 136. Соответствующее значение для управляющей последовательности ^M равно '015', для символа табуляции — '011', а для управляющей последовательности ^Z — '032'. Данная задача выполняется поэтапно.
Для замены в рассматриваемой команде последовательности символов '^^^^^^' символами табуляции используется следующий шаблон: "\136" "[\011*]". Затем полученные результаты перенаправляются во временный рабочий файл с именем stat.tmp.
$ tr -s '[\136]" "[\011*]" < stat.tr > stat.tmp
Boxes paper 12^M
Clips metal 50^M.
Pencils-medium 10^М
^Z
Для замены управляющих последовательностей ^M, расположенных в конце каждой строки, символом новой строки и устранения управляющей последовательности ^Z применяется шаблон \n. Не следует забывать, что входные данные поступают из временного файла stat.tmp.
$ tr -s "[\015\032]" "\n" < stat.tmp
Boxes paper 12
Clips metal 50
Pencils-medium 10
Таким образом, управляющие символы удаляются и файл готов к применению.
12.1.9. Быстрые преобразования
Если из файла необходимо удалить только управляющие последовательности ^M и заменить их символами новой строки, для этого применяется команда:
$ tr -s "[\015]" "\n" < файл_ввода
С другой стороны, для получения аналогичного результата можно воспользоваться командой:
$ tr -s "[\r]" "[\n]" < файл_ввода
То же самое преобразование можно выполнить и с помощью команды:
$ tr -s "\r" "\n" < файл_ввода
Еще один распространенный вариант преобразования файлов, перенесенных из DOS в UNIX, иллюстрирует команда:
$ tr -s "[\015\032]" "[\012*]" < файл_ввода
Эта команда удаляет управляющие последовательности ^M и ^Z и заменяет их символами новой строки.
Следующая команда удаляет символы табуляции, заменяя их пробелами:
$ tr -s "[\011]" "[\040*]" < файл_ввода
Для замены в файле пароля passwd всех двоеточий символами табуляции, двоеточие следует заключить в кавычки и указать в строке замены восьмеричное значение символа табуляции, которое равно '011'. Файл станет более удобным для чтения. Сначала приводится файл passwd, а затем команда с утилитой tr, которая выполняет задачу.
$ pg passwd
halt:*:7:0:halt:/sbin:/sbin/halt
mail:*:8:12.mail:/var/spool/mail:
news:*:9:13:news:/var/spool/news:
uucp:*:10:14:tmcp:/var/spool/uucp:
$ tr -s "[:]" "[\011]" < passwd
halt
*
7
0
halt
/sbin /sbin/halt
*
8
12
/var/spool/mail
news
*
9
13
news
/var/spool/news
uucp
*
10
14
uucp
/var/spool/uucp
С другой стороны, аналогичного результата можно добиться с помощью следующей команды, где указывается сокращенная запись символа табуляции:
$ tr "[:]" "[\t]" < passwd
12.1.10. Сравнение с несколькими символами
Для выполнения сравнения с несколькими символами применяется формат [character*n]. Ниже приводится содержимое файла, описывающего жесткие диски системы. В файле содержатся диски, которые зарегистрированы или распознаны системой. Первый столбец содержит числа. Если этот столбец не состоит из одних нулей, то регистрируется соответствующий диск во втором столбце.
Иногда надоедает наблюдать в подобных списках нули, поэтому заменим их символом, который привлекает к себе внимание. Тогда сразу становится видно, какие диски присутствуют в системе, а какие -oтсутствуют. Ниже приведена часть содержимого файла.
$ pg hdisk.txt
1293 hdisk3
4512 hdisk12
0000 hdisk5
4993 hdisk12
2994 hdisk7
При просмотре файла становится ясно, что имеется один жесткий диск, который не зарегистрирован. Для замены всех нулей, допустим, звездочками можно воспользоваться шаблоном [0*4], который означает поиск соответствия, по крайней мере, четырем нулям. При этом строка замены содержит только звездочки. Ниже приводится соответствующая команда и результат выполнения подобной фильтрации:
$ tr "[0*4]" "*" < hdisk.txt
1293 hdisk3
4512 hdisk12
**** hdisk5
4993 hdisk12
2994 hdisk7
Теперь, просматривая приведенный выше файл, можно сразу узнать, какой диск не зарегистрирован в системе.
12.2. Заключение
Утилита tr применяется, главным образом, для преобразования символов и удаления управляющих символов. Все функции, использованные в этой главе, могут быть реализованы и с помощью команды sed. Однако некоторые пользователи предпочитают применять утилиту tr, поскольку она выполняет те же задачи и более удобна в применении.