В Linux команда tr
используется для выполнения различных преобразований текста: преобразования регистра, сжатия и удаления символов, базовой замены текста.
В связи с тем, что утилита может читать файл напрямую и выводить результаты в стандартный вывод, она часто используется с конвейерами и перенаправлениями для обеспечения более сложной обработки содержимого файла.
Содержание
Синтаксис
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
при различных преобразованиях текста. При использовании перенаправлений возможности этой утилиты значительно возрастают и поэтому она часто применяется в скриптах.