Кроме перекодирования tr позволяет просто удалять символы из входного потока. Выше в этой главе мы обсуждали проблему преобразования текстовых файлов в формате MS-DOS в текст в формате Unix. Для такого преобразования достаточно просто удалить символы возврата каретки в конце каждой строки. Эту операцию можно выполнить с помощью tr:
tr -d '\r' <
где файл_dos — это файл, подлежащий преобразованию, а файл_unix — результат. В этой форме команды используется экранированная последовательность \r, представляющая символ возврата каретки. Чтобы увидеть полный список последовательностей и классов символов, поддерживаемых программой tr, попробуйте
[me@linuxbox ~]$ tr --help
ROT13: не самый надежный способ шифрования
Одно забавное применение команды tr —
echo "secret text" | tr a-zA-Z n-za-mN-ZA-M
frperg grkg
Повторное применение той же процедуры приводит к обратному преобразованию:
echo "frperg grkg" | tr a-zA-Z n-za-mN-ZA-M
secret text
Многие программы для работы с электронной почтой и чтения новостей Usenet поддерживают шифрование ROT13. В Википедии можно найти замечательную статью по этой теме:
tr также позволяет выполнять и другие трюки. При вызове с параметром -s команда tr «сжимает» (squeeze), или удаляет повторяющиеся экземпляры символов:
[me@linuxbox ~]$ echo "aaabbbccc" | tr -s ab
abccc
Здесь у нас имеется строка с повторяющимися символами. Передав множество ab команде tr, мы удалили повторяющиеся экземпляры символов, входящие в множество, при этом остальные символы (c), отсутствующие в множестве, остались нетронутыми. Обратите внимание, что повторяющиеся символы должны следовать подряд. В противном случае сжатие не даст никакого эффекта:
[me@linuxbox ~]$ echo "abcabcabc" | tr -s ab
abcabcabc
sed — потоковый редактор для фильтрации и преобразования текста
Имя sed — это сокращенное словосочетание
В общем случае sed используется следующим образом: ей передается единственная команда редактирования (в командной строке) или имя файла сценария с множеством команд, и она применяет эти команды к каждой строке в потоке текста. Ниже приводится очень простой пример sed в действии:
[me@linuxbox ~]$ echo "front" | sed 's/front/back/'
back
В этом примере с помощью echo создается поток текста с единственным словом, который по конвейеру передается программе sed. sed, в свою очередь, применяет инструкцию s/front/back/ к тексту в потоке и выводит результат. Эта команда напоминает команду подстановки (поиск с заменой) в редакторе vi.
Команды sed начинаются с единственной буквы. В примере, рассмотренном выше, буква s представляет команду подстановки (substitution). За ней следуют искомая строка и строка замены, разделенные слешем. В качестве разделителя можно использовать любые символы. По общепринятому соглашению, чаще других используется символ слеша, но sed будет использовать в качестве разделителя любой символ, следующий сразу за командой. Ту же самую команду можно было бы записать иначе:
[me@linuxbox ~]$ echo "front" | sed 's_front_back_'
back
Символ подчеркивания, следующий сразу за командой, становится разделителем. Возможность употребления произвольных разделителей можно использовать для улучшения читаемости команд, как будет показано далее.
Большинству команд в sed может предшествовать
[me@linuxbox ~]$ echo "front" | sed '1s/front/back/'
back