Команда Linux tr

Опубликовано admin - пт, 10/14/2022 - 16:11

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

Использование команды tr в Linux с примерами

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

Содержание

Синтаксис

tr [Опции] МАССИВ1 [МАССИВ2]

Опции

-c, -C, --complementuse
Используйте дополнение МАССИВ1
-d, --delete
Удалить символы в МАССИВЕ1, не переводить
-s, --squeeze-repeats
Замените каждую последовательность повторяющихся символов, перечисленных в последнем указанном МАССИВЕ, одним вхождением этого символа
-t, --truncate-set1
Сначала усеките МАССИВ1 до длины МАССИВ2

МАССИВЫ указываются как строки символов.

Интерпретируемые последовательности: 

\NNN
Символы с NNNвосьмеричным значением NNN (от 1 до 3 восьмеричных цифр)
\\
Обратный слэш
\a
Звуковой сигнал
\b
Клавиша Backspace
\f
Подача формы
\n
Новая строка
\r
Возврат каретки
\t
Горизонтальная табуляция
\v
Вертикальная табуляция
 
[:alnum:]
Все буквы и цифры
[:alpha:]
Все буквы
[:blank:]
Все горизонтальные пробелы
[:cntrl:]
Все управляющие символы
[:digit:]
Все цифры
[:graph:]
Все печатные символы, исключая пробел
[:lower:]
Все строчные буквы
[:print:]
Все печатные символы, включая пробел
[:punct:]
Все знаки пунктуации
[:space:]
Все горизонтальные или вертикальные пробельные символы
[:upper:]
Все заглавные буквы
[:xdigit:]
Все шестнадцатеричные числа

Преобразование происходит, если -d не задано и появляются как МАССИВ1, так и МАССИВ2. -t можно использовать только при переводе. МАССИВ2 расширяется до длины МАССИВА1 за счёт повторения его последнего символа по мере необходимости.

Лишние символы МАССИВА2 игнорируются.

Классы символов расширяются в неопределенном порядке; при переводе [:lower:] и [:upper:] могут использоваться парами для указания преобразования регистра.

Сжатие происходит после перевода или удаления.

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

Запуск без параметров

Запуск команды без каких-либо параметров заменяет каждый из символов, указанных в МАССИВЕ1, на символы из МАССИВА2 того же положения.

oleg@mobile:~:$ echo "Hellu, Wurld!" | tr u o
Hello, World!
oleg@mobile:~:$ 

Были исправлены ошибки в тексте, произведена замена u на o.

Изменение регистра символов

Существует три способа изменения регистра символов:

  • указание точных символов для преобразования;
  • указание диапазона символов для преобразования;
  • указание интерпретируемых последовательностей.

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

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

oleg@mobile:~:$ tr м М
массив
Массив

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

oleg@mobile:~:$ tr м,а,с,и,в  М,А,С,И,В
массив
МАССИВ

Указание диапазона символов для преобразования

В указанном диапазоне можно изменить регистр любого символа, например преобразовать нижний регистр в верхний:

oleg@mobile:~:$ tr a-z A-Z
hello, guys!
HELLO, GUYS!

Преобразует лишь символы латиницы.

Указание интерпретируемых последовательностей

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

oleg@mobile:~:$ tr [:lower:] [:upper:]
hello, guys!
HELLO, GUYS!

Также, как и предыдущий способ преобразует лишь символы латиницы.

Удаление повторяющихся символов

Опция -s позволяет сжимать повторяющиеся символы в один. Это очень полезно, например при наличии в тексте ряда пробелов, следующих один за другим:

oleg@mobile:~:$ echo "Добро    пожаловать   к    нам  на рюмку        чая!" | tr -s [:space:]
Добро пожаловать к нам на рюмку чая!
oleg@mobile:~:$ 

Удаление определённых символов

В этом случае используется опция -d:

oleg@mobile:~:$ echo "That's rok. Thanks a lort" | tr -d 'r'
That's ok. Thanks a lot
oleg@mobile:~:$

Удаление группы символов, например все цифры, указав [:digit:] последовательность:

oleg@mobile:~:$ echo "Ваш пин-код: 2022" | tr -d [:digit:]
Ваш пин-код: 
oleg@mobile:~:$ 

Дополнения

Если к предыдущему примеру добавить опцию -c, то будут удалены все символы, кроме цифр:

oleg@mobile:~:$ echo "Ваш пин-код: 2022" | tr -cd [:digit:]
2022oleg@mobile:~:$ 

Удаление символов новой строки

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

В этом случае можно использовать команду cat для открытия файла, который затем передать команде tr для преобразования:

Пример:

oleg@mobile:~/Directory:$ cat tr-example.txt 
Бойсе
Де-Мойн
Монтгомери
Джуно
Финикс
Литл-Рок
Шайенн
Олимпия
Монтпилиер
Ричмонд
Мадисон
Гонолулу
oleg@mobile:~/Directory:$ 

Выполняем преобразование:

oleg@mobile:~/Directory:$ cat tr-example.txt | tr -s '\n' ' '
Бойсе Де-Мойн Монтгомери Джуно Финикс Литл-Рок Шайенн Олимпия Монтпилиер Ричмонд Мадисон Гонолулу oleg@mobile:~/Directory:$ 

Проверяем:

oleg@mobile:~/Directory:$ cat tr-example.txt 
Бойсе
Де-Мойн
Монтгомери
Джуно
Финикс
Литл-Рок
Шайенн
Олимпия
Монтпилиер
Ричмонд
Мадисон
Гонолулу
oleg@mobile:~/Directory:$ 

В файле ничего не изменилось, так как вывод следует направлять в новый файл.

Сохранение вывода в файл

Повторяем предыдущий пример, но вывод перенаправим в новый файл:

oleg@mobile:~/Directory:$  cat tr-example.txt | tr -s '\n' ' ' < tr-example.txt > tr-example_2.txt 
oleg@mobile:~/Directory:$ 

Проверяем:

oleg@mobile:~/Directory:$ cat tr-example_2.txt 
Бойсе Де-Мойн Монтгомери Джуно Финикс Литл-Рок Шайенн Олимпия Монтпилиер Ричмонд Мадисон Гонолулу oleg@mobile:~/Directory:$ 

Всё ок!

Вывод списка уникальных слов

Вы можете вывести уникальные слова из файла с количеством их повторений:

oleg@mobile:~/Directory:$ cat linux-command-com.txt | tr -cs "[:alnum:]" "\n" | sort | uniq -c | sort -rnsort | uniq -c | sort -rn
     13 oleg
     13 mobile
     13 Directory
     12 usa
     12 txt
     12 states
     12 ru
     11 1
     10 comm
      9 2
      5 Linux
      4 order
      3 WY
      3 WI
      3 WA
      3 VT
      3 VA
      3 ID
      3 IA
      3 HI
      3 check
      3 AZ
      3 AR
      3 AL
      3 AK
      2 sort
      2 nocheck
      2 cat
      2 3
      1 zero
      1 z
      1 total
      1 terminated
      1 output
      1 orde
      1 o
      1 NUL
      1 LC
      1 delimiter
      1 COLLATE
      1 23
      1 13
      1 10
      1 
oleg@mobile:~/Directory:$ 

Заключение

Мы рассмотрели приёмы работы в Linux с командой tr при различных преобразованиях текста. При использовании перенаправлений возможности этой утилиты значительно возрастают и поэтому она часто применяется в скриптах.

Поделиться с друзьями