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 'l-n' 'w-z'
Когда используется опция -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
) заменяет последовательность повторяющихся вхождений на набор символов из последнего набора.
В следующем примере 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 'a-z' 'A-Z'
Чтобы преобразовать верхний регистр в нижний, просто поменяйте местами наборы.
Удалить все нечисловые символы
Следующая команда удаляет все нечисловые символы:
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
.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.