
tr — утилита командной строки в системах Linux и Unix, которая переводит, удаляет и сжимает символы из стандартного ввода и записывает результат в стандартный вывод.
Команда tr может выполнять такие операции, как удаление повторяющихся символов, преобразование заглавных букв в строчные, а также замену и удаление базовых символов. Обычно она используется в сочетании с другими командами посредством конвейеризации.
В этом уроке мы покажем вам, как использовать команду tr с помощью практических примеров и подробных объяснений наиболее распространенных опций.
Как использовать команду tr
Синтаксис команды tr следующий:
tr OPTION... SET1 [ SET2 ]
tr принимает два набора символов, обычно одинаковой длины, и заменяет символы первого набора соответствующими символами из второго набора.
SET — это, по сути, строка символов, включая специальные символы, экранированные обратной косой чертой.
В следующем примере tr заменит все символы из стандартного ввода (linuxize), сопоставив символы из первого набора с соответствующими символами из второго набора.
echo 'linuxize' | tr 'lin' 'red'
Каждое вхождение l заменяется на r , i на e , а n на d :
reduxeze
Наборы символов также можно определить с помощью диапазонов символов. Например, вместо того, чтобы писать:
echo 'linuxize' | tr 'lmno' 'wxyz'
вы можете использовать:
echo 'linuxize' | tr 'ln' 'wz'
При использовании опции -c ( --complement ) tr заменяет все символы, которых нет в SET1.
В приведенном ниже примере все символы, кроме «li», будут заменены последним символом из второго набора:
echo 'linuxize' | tr -c 'li' 'xy'
liyyyiyyy
Как вы могли заметить, в выводе выше на один видимый символ больше, чем во входных данных. Это связано с тем, что команда echo выводит невидимый символ новой строки n , который также заменяется на y . Чтобы вывести строку без новой строки, используйте опцию -n .
Опция -d ( --delete ) указывает tr удалить символы, указанные в наборе SET1. При удалении символов без сжатия укажите только один набор.
Приведенная ниже команда удалит символы l , i и z :
echo 'Linuxize' | tr -d 'liz'
Символ L не удаляется, поскольку входные данные содержат заглавную букву L тогда как символ l в SET является строчным.
Lnuxe
Опция -s ( --squeeze-repeats ) заменяет последовательность повторяющихся вхождений набором символов в последнем SET.
В следующем примере tr удаляет повторяющиеся пробелы:
echo "GNU Linux" | tr -s ' '
GNU Linux
При использовании SET2 последовательность символов, указанная в SET1, заменяется на SET2.
echo "GNU Linux" | tr -s ' ' '_'
GNU__Linux
Опция -t ( --truncate-set1 ) заставляет tr обрезать SET1 до длины SET2 перед дальнейшей обработкой.
По умолчанию, если SET1 больше SET2, tr повторно использует последний символ SET2. Вот пример:
echo 'Linux ize' | tr 'abcde' '12'
Выходные данные показывают, что символ e из SET1 совпадает с последним символом SET2, который равен 2 :
Linux iz2
Теперь используйте ту же команду с опцией -t :
echo 'Linux ize' | tr -t 'abcde' '12'
Linux ize
Видно, что последние три символа SET1 удалены. SET1 становится «ab», той же длины, что и SET2, и никакая замена не производится.
Комбинирование вариантов
Команда tr также позволяет комбинировать свои параметры. Например, следующая команда сначала заменяет все символы, кроме i на 0 , а затем сжимает повторяющиеся символы 0 :
echo 'Linux ize' | tr -cs 'i' '0'
0i0i0
Примеры команд Tr
В этом разделе мы рассмотрим несколько примеров распространенных вариантов использования команды tr .
Преобразовать строчные буквы в заглавные
Преобразование строчных букв в заглавные или наоборот — один из типичных вариантов использования команды tr . [:lower:] соответствует всем строчным символам, а [:upper:] соответствует всем заглавным символам.
echo 'Linuxize' | tr '[:lower:]' '[:upper:]'
LINUXIZE
Вместо классов символов вы также можете использовать диапазоны:
echo 'Linuxize' | tr 'az' 'AZ'
Чтобы преобразовать заглавные буквы в строчные, просто поменяйте местами наборы.
Удалить все нецифровые символы
Следующая команда удаляет все нечисловые символы:
echo "my phone is 123-456-7890" | tr -cd [:digit:]
[:digit:] обозначает все цифровые символы, а при использовании опции -c команда удаляет все символы, не являющиеся цифрами. Вывод будет выглядеть следующим образом:
1234567890
Каждое слово пишите в новой строке
Чтобы поместить каждое слово в новую строку, нам нужно сопоставить все небуквенно-цифровые символы и заменить их на новую строку:
echo 'GNU is an operating system' | tr -cs '[:alnum:]' 'n'
GNU is an operating system
Удалить пустые строки
Чтобы удалить пустые строки, просто сожмите повторяющиеся символы новой строки:
tr -s 'n' < file.txt > new_file.txt
В приведённой выше команде мы используем символ перенаправления < для передачи содержимого file.txt команде tr . Символ перенаправления > записывает вывод команды в new_file.txt .
Вывести каталоги $PATH на отдельной строке
Переменная среды $PATH — это список каталогов, разделенных двоеточиями, который сообщает оболочке, в каких каталогах искать исполняемые файлы при вводе команды.
Чтобы напечатать каждый каталог на отдельной строке, нам нужно заменить двоеточие ( : ) на новую строку:
echo $PATH | tr ':' 'n'
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin
Заключение
tr — команда для перевода или удаления символов.
Несмотря на свою полезность, tr может работать только с отдельными символами. Для более сложного сопоставления с шаблоном и работы со строками следует использовать sed или awk .
Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.
Связанные руководства