Команда 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 указывает tr удалить указанные символы.
    • [:punct:] — это класс символов, представляющий все знаки пунктуации. Классы символов — это предопределенные наборы, которые упрощают указание групп символов.

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

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

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

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

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

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

Теперь декодируем его:

cat ~/project/encoded.txt | tr 'b-zaB-ZA' 'a-zA-Z'

Вы должны увидеть:

This is a secret message.

Разберем эту команду:

  1. cat ~/project/encoded.txt: считывает содержимое закодированного файла.
  2. |: передает вывод команде tr.
  3. tr 'b-zaB-ZA' 'a-zA-Z':
    • Первый набор b-zaB-ZA объединяет два сдвинутых алфавита:
      • b-za: строчные буквы от b до z, за которыми следует a
      • B-ZA: заглавные буквы от B до Z, за которыми следует A
    • Вместе они охватывают каждую букву, которую нужно сдвинуть назад на одну позицию.
    • Второй набор a-zA-Z — это: строчные буквы от a до z, за которыми следуют заглавные от A до Z.
    • Это создает отображение, где каждая буква из первого набора заменяется соответствующей буквой из второго набора:
      • b (1-я в первом наборе) → a (1-я во втором наборе)
      • c (2-я в первом наборе) → b (2-я во втором наборе)
      • ...
      • a (26-я в первом наборе) → z (26-я во втором наборе)
      • B (27-я в первом наборе) → A (27-я во втором наборе)
      • ...
      • A (52-я в первом наборе) → Z (52-я во втором наборе)
    • Это эффективно сдвигает каждую букву во входных данных назад на одну позицию в алфавите как для строчных, так и для заглавных букв, что правильно декодирует сообщение.

Этот тип подстановки — простейшая форма шифрования, называемая шифром Цезаря. Хотя он не является безопасным для реального использования, это отличный пример того, как 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 инвертирует набор (означает «все, кроме этого набора»).
    • Опция -d удаляет указанные символы.
    • [:digit:] — это класс символов, представляющий все цифры (0-9).
    • Вместе -cd '[:digit:]' означает «удалить все символы, которые не являются цифрами».

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

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

Команда tr также может «сжимать» повторяющиеся символы в одно вхождение. Это полезно для очистки данных с ненужными повторами. Давайте создадим файл с повторяющимися символами и очистим его.

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

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 сжимает повторы указанного символа в одно вхождение.
    • ' ' указывает, что мы хотим сжать символы пробела.

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

Резюме

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

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

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

  • -c: инвертировать набор символов в string1, то есть работать со всеми символами, которых нет в string1
  • -t: усечь string1 до длины string2

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