tr и fmt в Linux: форматирование текста

tr переводит или удаляет отдельные символы в потоке текста; fmt ломает и выравнивает строки под заданную ширину. Оба инструмента работают с stdin/stdout, просты в скриптах и полезны для быстрой предобработки текста. В статье — синтаксис, приемы, примеры, когда они не подходят и альтернативы.
Введение
Linux предоставляет множество инструментов для обработки текста. Команды tr и fmt помогают изменять, форматировать и упорядочивать текст прямо из терминала. Они просты, быстры и хорошо подходят для потоковой обработки (пайплайнов).
Кратко: tr — по-символьная трансформация и удаление; fmt — перенос и оптимизация длины строк.
Что такое tr
tr — сокращение от translate. Команда заменяет или удаляет конкретные символы в потоке ввода. Обычно её используют в конвейерах вместе с другими утилитами: tr читает stdin, выполняет операцию и пишет результат в stdout.
Синтаксис tr
tr [option]... SET1 [SET2]SET — наборы символов или интерпретируемые последовательности. Часто используемые последовательности:
\\ Backslash
\b Backspace
\t Horizontal tab
\v Vertical tab
[:alnum:] Все буквы и цифры
[:alpha:] Все буквы
[:blank:] Горизонтальные пробелы
[:digit:] Все цифры
[:lower:] Все строчные символы
[:punct:] Все знаки пунктуации
[:space:] Горизонтальные или вертикальные пробелы
[:upper:] Все заглавные буквыОбратите внимание: в примерах в код-блоках обратный слэш экранирован для корректного отображения терминальных последовательностей.
Примеры использования tr
Для демонстрации создайте файл muo.txt со строкой:
MakeUseOf. Technology, Simplified! 1234 Замена символов
Чтобы заменить указанные символы на другие, укажите первый набор и второй набор. Например, заменить символы M, T, S и 1 на последовательность ABCD:
cat muo.txt | tr MTS1 ABCDРезультат:
AakeUseOf. Bechnology, Cimplified! D234cat используется здесь для примера; tr также может работать с вводом из файла через перенаправление.
Преобразование регистра в верхний
cat muo.txt | tr a-z A-Z
cat muo.txt | tr [:lower:] [:upper:]Результат:
MAKEUSEOF. TECHNOLOGY, SIMPLIFIED! 1234 Преобразование регистра в нижний
cat muo.txt | tr A-Z a-z
cat muo.txt | tr [:upper:] [:lower:]Результат:
makeuseof. technology, simplified! 1234Замена пробелов на табы
cat muo.txt | tr [:space:] '\t'Результат (отображено как ширина/табуляция):
MakeUseOf. Technology, Simplified! 1234 Если вместо таба поставить ‘\n’, вы получите каждое слово на новой строке.
Удаление символов
Опция -d удаляет символы из потока. Например, удалить все буквы «e»:
cat muo.txt | tr -d 'e'Результат:
MakUsOf. Tchnology, Simplifid! 1234 Удаление знаков пунктуации
cat muo.txt | tr -d [:punct:]Результат:
MakeUseOf Technology Simplified 1234Удаление цифр
cat muo.txt | tr -d [:digit:]Результат:
MakeUseOf. Technology, Simplified! Дополнение (complement)
Опция -c инвертирует набор символов. Опция -cd комбинирует инверсию с удалением — удаляются все символы, не указанные в наборе. Например, оставить только цифры:
cat muo.txt | tr -cd [:digit:]Результат:
1234 Что такое fmt
fmt — простая утилита для форматирования абзацев. Она ломает строки и старается сделать текст удобочитаемым, автоматически перенося слова так, чтобы не превышать заданную ширину колонки. Часто используется для подготовки писем и чтения текстов в консоли.
Запрос справки:
man fmtСинтаксис fmt
fmt [-WIDTH] [OPTION] [FILE]По умолчанию ширина составляет 75 столбцов.
Примеры использования fmt
Создайте файл file.txt со следующим содержимым:
Technology, Simplified
We're tech enthusiasts on a mission to teach the world how to use and understand the tech in their lives.Стандартное форматирование
fmt file.txtРезультат:
Technology, Simplified We're tech enthusiasts on a mission to teach the
world how to use and understand the tech in their lives.fmt старается заполнить строки оптимально, не превышая 75 столбцов.
Изменение ширины
Опция -w (или запись -WIDTH) задаёт ширину в столбцах:
fmt -w 20 file.txtРезультат:
Technology,
Simplified We're
tech enthusiasts on
a mission to teach
the world how to
use and understand
the tech in their
lives.Разбиение длинных строк
Опция -s разбивает длинные строки сильнее, сохраняя более короткие слова без склеивания:
fmt -s file.txtРезультат:
Technology, Simplified
We're tech enthusiasts on a mission to teach the world how to use and
understand the tech in their lives.Отступ первой строки абзаца
Опция -t добавляет отступ первой строки каждого абзаца:
fmt -t file.txtРезультат:
Technology, Simplified
We're tech enthusiasts on a mission to teach the world how to use and
understand the tech in their lives.Когда tr или fmt не подходят
- Для сложных синтаксических преобразований лучше использовать awk или perl. tr работает только с одиночными символами и наборами.
- fmt не понимает контекстных правил разметки (HTML, Markdown, YAML). Он ломает строки, опираясь только на пробелы и длину строк.
- Для многострочных структур с вложенностью и сохранением форматирования применяйте целевые парсеры (htmltidy, pandoc, специализированные библиотеки).
Альтернативные подходы
- sed — построчное потоковое редактирование, замены по шаблону, вставки и удаления блоков.
- awk — поле-ориентированная обработка, удобна для табличных данных и более сложной логики.
- perl — мощные регулярные выражения и текстовые трансформации в одном инструменте.
- paste, cut, join — операции с колонками и простая обработка CSV/TSV.
Выбор: для простых символьных замен — tr; для разбиения/выравнивания — fmt; для логики — awk/sed/perl.
Шпаргалка (cheat sheet)
- Перевод регистра: tr a-z A-Z
- Удалить символы: tr -d ‘chars’
- Оставить только цифры: tr -cd [:digit:]
- Преобразовать пробелы в табы: tr [:space:] ‘\t’
- Привести текст к ширине 80: fmt -w 80 file.txt
- Сохранить отступы первой строки: fmt -t file.txt
- Разбивать длинные строки: fmt -s file.txt
Краткая методология выбора инструмента
- Определите гранularity: символы или поля/строки?
- Если нужно заменить отдельные символы — tr.
- Если нужно форматировать абзацы по ширине — fmt.
- Если требуется контекст или логика — awk/sed/perl.
- Тестируйте на небольших примерах, затем интегрируйте в скрипт.
Ролевые чек-листы
Разработчик:
- Проверить соглашения по кодировке (UTF-8).
- Использовать tr только для однобайтовых замен или наборов POSIX.
- Добавить unit-тесты на входы с краевыми символами.
Системный администратор:
- В скриптах обеспечить обработку пустых файлов.
- Учесть поведение при CRLF (windows) и LF (unix).
- Добавить логирование и безопасную обработку ошибок.
Технический писатель:
- Пробовать fmt для подготовки текстов перед публикацией.
- Проверять переносы и не ломать специализированную разметку.
Критерии приёмки
- Скрипт с tr/ fmt корректно обрабатывает тестовый набор входных файлов.
- Нет потери значимых символов или разметки при ожидаемых форматах.
- Поведение документировано в README с примерами использования.
Примеры ошибок и как их избежать
- Ошибка: некорректная замена из-за UTF-8 многобайтовых символов. Решение: работать в однобайтовой кодировке или использовать iconv/awk/perl.
- Ошибка: fmt ломает Markdown. Решение: не прогонять исходный Markdown через fmt, используйте специализированные инструменты.
FAQ
Как tr работает с Unicode?
tr оперирует байтами и наборы POSIX предназначены для однобайтовых локалей. Для безопасной работы с Unicode используйте perl или awk с поддержкой UTF-8.
Можно ли заменить слова, а не символы с помощью tr?
Нет. tr заменяет отдельные символы. Для замены слов используйте sed или perl.
Как применить fmt к нескольким файлам рекурсивно?
Используйте find в комбинации с xargs или цикл shell и запускайте fmt для каждого файла.
Заключение
tr и fmt — полезные утилиты для быстрой и автоматизированной обработки текста в терминале. tr хорошо подходит для низкоуровневых символьных преобразований, а fmt — для выравнивания и переноса строк по ширине. Для сложных задач комбинируйте их с sed, awk или perl.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента