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 .
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.