tr (преобразование)
100%

Text-Fu · Урок 13

tr (преобразование)

Научитесь преобразовывать, удалять и сжимать наборы символов в потоке стандартного ввода.

Команда tr, сокращение от translate, преобразует, удаляет или сжимает символы, прочитанные из stdin. Она не принимает обычные операнды входных файлов, поэтому предоставляйте данные через конвейер или перенаправление ввода.

Основной синтаксис:

tr [OPTIONS] SET1 [SET2]

tr работает с наборами символов, а не со словами или общими регулярными выражениями. Если преобразование зависит от полного слова, структуры строки или окружающего контекста, используйте другой инструмент.

Преобразование символов

При двух наборах символы из SET1 сопоставляются по позициям символам из SET2:

$ echo "hello world" | tr a-z A-Z
HELLO WORLD

Здесь позиции диапазона строчных букв сопоставляются соответствующим прописным. Заключайте выражения наборов в кавычки, чтобы оболочка передавала их без изменений.

Можно также заменять один символ другим:

$ echo "2026-06-23" | tr '-' '/'
2026/06/23
$ echo "abc123" | tr 'abc' 'ABC'
ABC123

Символы, не входящие в SET1, проходят без изменений.

Что выведет printf '%s\n' 'abc123' | tr 'abc' 'ABC'?

Удаление символов

Используйте -d с одним набором, чтобы удалить каждый совпадающий символ:

$ echo "My address is 123 Main Street" | tr -d '0-9'
My address is  Main Street

Каждая цифра удаляется независимо; tr не распознаёт число как цельный токен.

Классы символов описывают группы, определяемые текущей локалью:

$ echo "Hello, world!" | tr -d '[:punct:]'
Hello world

Удаление переводов строк объединяет входные строки без вставки разделителя:

$ printf "one\ntwo\nthree\n" | tr -d '\n'
onetwothree

:::single-choice{#tr-delete-digits} Какая команда удаляет из stdin все цифры, оставляя другие символы без изменений?

::option[tr -d '[:digit:]']{#tr-delete-digit-class .correct explanation="Параметр -d удаляет из входного потока все символы класса цифр."} ::option[tr -s '[:digit:]']{#tr-squeeze-digits explanation="Параметр -s сжимает повторяющиеся цифры, но оставляет по одному символу из каждой последовательности."} ::option[tr '[:digit:]']{#tr-one-set-no-delete explanation="Для преобразования обычно нужен второй набор. Один набор не запрашивает удаление."} :::

Сжатие повторяющихся символов

Используйте -s SET, чтобы заменить каждую последовательность указанного символа одним его экземпляром:

$ echo "Hello      World,   how   are   you?" | tr -s ' '
Hello World, how are you?

Набор содержит обычный пробел, поэтому эта команда не сжимает табуляции и переводы строк.

Можно сжимать и повторяющиеся переводы строк:

$ printf "one\n\n\nTwo\n" | tr -s '\n'
one
Two

Какая команда сокращает каждую последовательность обычных пробелов в stdin до одного пробела?

Классы символов и дополнения

Во многих локалях классы символов яснее выражают намерение, чем записанные вручную диапазоны. Распространённые классы:

  • [:lower:]: строчные буквы.
  • [:upper:]: прописные буквы.
  • [:digit:]: цифры.
  • [:alpha:]: буквы.
  • [:alnum:]: буквы и цифры.
  • [:space:]: пробельные символы.
  • [:punct:]: знаки препинания.

Например, преобразуем строчный текст в прописной с помощью классов:

$ echo "linux journey" | tr '[:lower:]' '[:upper:]'
LINUX JOURNEY

Параметр -c дополняет SET1, то есть выбирает каждый символ, не входящий в набор. Объедините его с -d, чтобы оставить только выбранные виды символов:

$ echo "user@example.com!" | tr -cd '[:alnum:]'
userexamplecom

Команда также удаляет перевод строки, поскольку он не является буквой или цифрой. Если важны границы записей, добавляйте или сохраняйте разделители намеренно.

Что делает tr -cd '[:alnum:]' с stdin?

Построение потоковых преобразований

Несколько процессов tr можно соединить, если преобразования понятнее как отдельные этапы:

$ echo "Hello,,,     world!!!" | tr -d '[:punct:]' | tr -s ' '
Hello world

Для простого ввода с табуляциями преобразуйте их в запятые:

$ printf "name\tlevel\npete\tbeginner\n" | tr '\t' ','
name,level
pete,beginner

Поскольку tr читает stdin, файл можно предоставить через <:

$ tr '[:lower:]' '[:upper:]' < names.txt

Чтобы сохранить результат, перенаправьте stdout в другой файл. Не направляйте его обратно во входной путь: оболочка усечёт файл до того, как tr прочитает его.

:::single-choice{#tr-read-file-input} Какая команда заставляет tr прочитать names.txt через stdin и преобразовать строчные символы в прописные?

::option[tr names.txt '[:lower:]' '[:upper:]']{#tr-file-operand explanation="tr не принимает обычное имя входного файла таким способом; лишний операнд делает синтаксис недопустимым."} ::option[tr -d '[:lower:]' < names.txt]{#tr-delete-lowercase explanation="Файл читается правильно, но строчные буквы удаляются, а не преобразуются."} ::option[tr '[:lower:]' '[:upper:]' < names.txt]{#tr-input-redirection .correct explanation="Оболочка открывает names.txt как stdin, а tr сопоставляет класс строчных букв классу прописных."} :::

Чтобы попрактиковаться в посимвольных потоковых преобразованиях, выполните лабораторную работу:

  1. Команда tr в Linux: преобразование символов — научитесь преобразовывать и удалять символы, работать с классами и сжимать повторы.

Урок завершён

Вы завершили tr (преобразование)

Теперь вы можете выполнять точечные преобразования потоков символов с помощью tr.

  • Сопоставляйте символы между соответствующими наборами.

  • Удаляйте выбранные символы параметром -d.

  • Сжимайте повторяющиеся символы параметром -s.

  • Осознанно используйте классы локали и дополнения.

  • Предоставляйте ввод через stdin, а не файловый операнд.

Сохраните прогресс

Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.

Создать бесплатный аккаунт
Следующий Урок
Назад к Text-Fu