Введение
Tr — это утилита командной строки в системах Linux и Unix, которая переводит, удаляет и сжимает символы из стандартного ввода и записывает результат в стандартный вывод.
Команда tr обычно используется в сочетании с другими командами через конвейер и может выполнять такие операции, как удаление повторяющихся символов, преобразование верхнего регистра в нижний, а также замена и удаление основных символов.
В этом руководстве мы покажем вам, как использовать команду tr на практических примерах и подробных объяснениях наиболее распространенных параметров.
Как использовать команду Tr
Синтаксис команды tr следующий:
tr OPTION... SET1 [SET2]
tr принимает два набора символов, обычно одинаковой длины, и заменяет символы из первых наборов соответствующими символами из второго набора.
SET — это в основном последовательность символов, включая специальные экранированные символы обратной косой черты.
В следующем примере tr заменит все символы из ввода noviello, сопоставив символы из первого набора с соответствующими символами из второго набора.
echo 'noviello' | tr 'nov' 'red'
tr заменит каждое вхождение n на r или на e и v на d.
Вывод будет выглядеть следующим образом:
redielle
Наборы символов также можно определить с помощью диапазонов символов. Например, вместо того, чтобы писать:
echo 'noviello' | tr 'nvl' 'xyz'
xoyiezzo
Вы можете использовать:
echo 'noviello' | tr 'ln' 'w-z'
yoviewwo
Когда используется опция -c (--complement), tr заменяет любые символы, не найденные в SET1.
В следующем примере все символы, которых нет в SET1, будут заменены последним символом из SET2:
echo 'noviello' | tr -c 'no' 'xy'
Как вы могли заметить, вывод имеет более заметный характер, чем ввод. Это связано с тем, что команда echo печатает невидимый символ \ n (новая строка), который также заменяется на y. Чтобы отобразить строку без новой строки, используйте параметр -n.
noyyyyyoy
Параметр -d (--delete) позволяет удалить символы, указанные в SET1.
Следующая команда удалит все символы, указанные в SET1. При удалении символов без сжатия можно указать только один набор.
echo 'noviello' | tr -d 'nol'
Символ L не будет удален, потому что ввод включает заглавную букву L, а символ l установлен в нижнем регистре.
vie
Опция -s (--squeeze-repeats) заменяет последовательность повторяющихся вхождений на набор символов из последнего SET. В следующем примере будут удалены повторяющиеся символы пробела:
echo "GNU \ Linux" | tr -s ' '
GNU \ Linux
При использовании SET2 последовательность символов, указанная в SET1, заменяется на SET2.
echo "GNU \ Linux" | tr -s ' ' '_'
GNU_\_Linux
Параметр -t (--truncate-set1) принудительно усекает SET1 до длины SET2 перед выполнением дальнейшей обработки.
По умолчанию, если SET1 больше, чем SET2, tr будет повторно использовать последний символ SET2. Вот пример:
echo 'novi ello' | tr 'abcde' '12'
Вывод покажет, что символ e из SET1 соответствует последнему символу из SET2, который равен 2:
novi 2llo
Теперь используйте ту же команду с параметром -t:
echo 'novi ello' | tr -t 'abcde' '12'
Видно, что в этом случае удаляются последние три символа SET1. SET1 становится «ab» той же длины, что и SET2.
novi ello
Комбинация вариантов
Команда tr также позволяет комбинировать ее параметры. Например, следующая команда заменит все символы, кроме i, на 0, а затем сожмет повторяющиеся 0 символов:
echo 'novi ello' | tr -cs 'i' '0'
0i0
Преобразование строчных букв в прописные
Преобразование строчных букв в прописные или наоборот — один из типичных вариантов использования команды tr. [:lower:] соответствует всем символам нижнего регистра, а [:upper:] соответствует всем символам верхнего регистра.
echo 'Noviello' | tr '[:lower:]' '[:upper:]'
NOVIELLO
Вместо классов символов вы также можете использовать диапазоны:
echo 'Noviello' | tr 'az' 'A-Z'
Чтобы преобразовать верхний регистр в нижний, просто измените положение наборов, затем:
echo 'Noviello' | tr '[:upper:]' '[:lower:]'
noviello
Удалить все нечисловые символы
В следующем примере будут удалены все нечисловые символы из ввода команды tr:
echo "numero 123-456-789" | tr -cd [:digit:]
[: цифра:] обозначает все цифровые символы, а с помощью параметра -c команда удаляет все нецифровые символы. Вывод будет выглядеть следующим образом:
123456789
Поместите каждое слово на новую строку
Чтобы поместить каждое слово в новую строку, нам нужно сопоставить все небуквенно-цифровые символы и заменить их новой строкой:
echo 'Coding is my cardio,' | tr -cs '[:alnum:]' '\n'
Вы должны получить выходное сообщение, подобное следующему:
Coding
is
my
cardio
Удалить пустые строки
Чтобы удалить пустые строки, просто нажмите повторяющиеся символы новой строки:
tr -s '\n' < mylog.txt > new_file.txt
В приведенной выше команде мы используем символ перенаправления < для передачи содержимого команды mylog.txt в команду tr в качестве входных данных. Перенаправление > записывает вывод команды в new_file.txt.
Вывести каталоги $PATH на отдельной строке
Переменная среды $PATH представляет собой список каталогов, разделенных двоеточиями, который сообщает оболочке, в каких каталогах искать исполняемые файлы при вводе команды.
Чтобы напечатать каждый каталог в отдельной строке, нам нужно сопоставить двоеточие ( :) и заменить его новой строкой:
echo $PATH | tr ':' '\n'
Вы должны получить выходное сообщение, подобное следующему:
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin...
Вывод
К настоящему времени вы должны хорошо понимать, как использовать команду tr в Linux.