Команда Linux tr: преобразование символов

LinuxBeginner
Практиковаться сейчас

Введение

В рамках этой лабораторной работы мы изучим команду tr в Linux — универсальный инструмент для преобразования текста на уровне отдельных символов. Название команды tr происходит от слова "translate" (переводить/заменять). Она широко применяется для таких задач, как изменение регистра, удаление определенных символов и базовая очистка данных. К концу занятия вы научитесь уверенно использовать tr в различных сценариях манипуляции текстом. Этот урок ориентирован на новичков, поэтому не беспокойтесь, если вы только начинаете знакомство с командами Linux — мы подробно разберем каждый шаг.

Основы работы с tr

Начнем с изучения базового синтаксиса команды tr:

tr [OPTION]... SET1 [SET2]

Команда tr считывает текст из стандартного потока ввода (stdin), преобразует его в соответствии с заданными опциями и наборами символов, а затем выводит результат в стандартный поток вывода (stdout).

Рассмотрим простой пример. Создадим файл greeting.txt с приветствием и с помощью tr переведем все строчные буквы в заглавные.

Сначала создайте файл:

echo "hello, world" > ~/project/greeting.txt

Совет: Вы можете копировать и вставлять команды создания файлов в терминал, чтобы избежать ошибок при вводе.

Эта команда создает новый файл greeting.txt в директории вашего проекта (~/project/) с текстом "hello, world".

Теперь воспользуемся tr, чтобы сделать все буквы заглавными:

cat ~/project/greeting.txt | tr 'a-z' 'A-Z'

Вы должны увидеть следующий результат:

HELLO, WORLD

Разберем эту команду по частям:

  1. cat ~/project/greeting.txt: Читает содержимое файла.
  2. |: Символ конвейера (pipe). Он берет вывод команды слева и передает его на вход команде справа.
  3. tr 'a-z' 'A-Z': Сама команда tr. Она заменяет каждый символ из первого набора ('a-z', представляющего все строчные буквы) на соответствующий символ из второго набора ('A-Z', представляющего все заглавные буквы).

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

Удаление символов с помощью tr

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

Сначала создайте файл со знаками препинания:

echo "Hello, World! How are you?" > ~/project/punctuated.txt

Совет: Вы можете копировать и вставлять команды создания файлов в терминал для точности.

Теперь используем tr для удаления всей пунктуации:

cat ~/project/punctuated.txt | tr -d '[:punct:]'

Результат будет таким:

Hello World How are you

Разбор команды:

  1. cat ~/project/punctuated.txt: Читает содержимое файла.
  2. |: Передает вывод команде tr.
  3. tr -d '[:punct:]':
    • Опция -d (delete) указывает tr удалить указанные символы.
    • [:punct:] — это класс символов, представляющий все знаки пунктуации. Классы символов — это предопределенные наборы, которые упрощают выбор групп знаков.

Эта команда удаляет все знаки препинания, оставляя только буквы, цифры и пробелы.

Замена нескольких символов

Теперь перейдем к более сложной замене. Мы создадим файл с зашифрованным текстом и используем tr для его расшифровки. Этот пример наглядно показывает, как tr может применяться для простого шифрования и дешифрования.

Сначала создайте файл с закодированным текстом:

echo "Tijt jt b tfdsfu nfttbhf." > ~/project/encoded.txt

Совет: Используйте копирование и вставку для команд создания файлов.

Теперь расшифруем его:

cat ~/project/encoded.txt | tr 'b-za-a' 'a-z'

Вы увидите:

This is a secret message.

Разбор команды:

  1. cat ~/project/encoded.txt: Читает содержимое зашифрованного файла.
  2. |: Передает данные команде tr.
  3. tr 'b-za-a' 'a-z':
    • Первый набор 'b-za-a' состоит из:
      • 'b-z': буквы от b до z
      • 'a-a': буква a
      • Таким образом, полный первый набор: b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a
    • Второй набор 'a-z' — это стандартный алфавит: a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
    • Это создает сопоставление, где каждая буква из первого набора заменяется на соответствующую букву из второго:
      • b (1-я в первом наборе) → a (1-я во втором)
      • c (2-я в первом наборе) → b (2-я во втором)
      • ...
      • a (26-я в первом наборе) → z (26-я во втором)
    • Фактически, это сдвигает каждую букву ввода на одну позицию назад по алфавиту (дешифровка шифра Цезаря).
    • Примечание: Команда tr выполняет замену посимвольно, поэтому затронуты только строчные буквы. Заглавная "T" в начале сообщения осталась без изменений, так как она не совпала ни с одним символом из первого набора.

Такой тип подстановки является простейшей формой шифрования, называемой шифром Цезаря. Хотя он не подходит для реальной защиты данных, это отличный пример того, как tr справляется с посимвольной заменой.

Использование классов символов в tr

Команда tr поддерживает различные классы символов — предопределенные наборы знаков. Они крайне полезны для сложных трансформаций. Применим их в практическом сценарии.

Создайте файл со смешанным содержимым:

echo "User123 logged in at 09:45 AM on 2023-08-15" > ~/project/log_entry.txt

Совет: Скопируйте команду в терминал для создания файла.

Теперь извлечем из этой записи лога только цифры:

cat ~/project/log_entry.txt | tr -cd '[:digit:]'

Вы увидите:

12309452023815

Разбор команды:

  1. cat ~/project/log_entry.txt: Читает содержимое лог-файла.
  2. |: Передает данные команде tr.
  3. tr -cd '[:digit:]':
    • Опция -c (complement) дополняет набор (означает "все, кроме этого набора").
    • Опция -d (delete) удаляет указанные символы.
    • [:digit:] — класс символов, представляющий все цифры (0-9).
    • Вместе -cd '[:digit:]' означает "удалить все символы, которые НЕ являются цифрами".

Эта команда полезна для извлечения числовых данных из смешанного текста, что часто требуется при анализе логов или очистке данных.

Сжатие повторов с помощью tr

Команда tr также умеет "сжимать" (squeeze) последовательности повторяющихся символов в один экземпляр. Это полезно для очистки данных от лишних повторов. Создадим файл с лишними пробелами и исправим его.

Сначала создайте файл с множественными пробелами:

echo "This    is    a    test    with    extra    spaces." > ~/project/spaced.txt

Совет: Скопируйте команду в терминал.

Теперь используем tr, чтобы сжать повторяющиеся пробелы:

cat ~/project/spaced.txt | tr -s ' '

Вы увидите:

This is a test with extra spaces.

Разбор команды:

  1. cat ~/project/spaced.txt: Читает файл с лишними пробелами.
  2. |: Передает данные команде tr.
  3. tr -s ' ':
    • Опция -s (squeeze-repeats) заменяет последовательность идентичных символов, указанных в наборе, на один такой символ.
    • ' ' указывает, что мы хотим сжать именно пробелы.

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

Резюме

В ходе этой лабораторной работы мы изучили возможности универсальной команды tr в Linux. Мы научились:

  1. Менять регистр текста.
  2. Удалять определенные символы.
  3. Выполнять замену нескольких символов.
  4. Использовать классы символов.
  5. Сжимать повторяющиеся символы.

Команда tr — это мощный инструмент для манипуляции текстом. Вот еще несколько опций, которые мы не рассматривали подробно:

  • -c: Дополнение набора символов (работа со всеми символами, не входящими в указанный набор).
  • -t: Обрезание первого набора до длины второго набора.

Для решения более сложных задач по обработке текста в будущих уроках вы можете изучить такие команды, как sed и awk.