Как использовать команду Linux tr
Опубликовано: 2023-05-17Вам нужен простой метод управления потоком текста в Linux? Не ищите ничего, кроме команды tr, которая может сэкономить ваше время при замене, удалении, объединении и сжатии вводимого текста. Вот как это делается.
Что такое команда tr?
Замена символов
Использование диапазонов и токенов
Инвертирование спичек
Удаление и сжатие символов
Удаление символов
Объединение и разделение линий
Использование tr с каналами
Просто как просто
Что такое команда tr?
Команда Linux tr
— это быстрая и простая утилита для удаления ненужных символов из потоков текста и других изящных приемов манипулирования. Он получил свое название от слова «перевод», и корни tr
уходят глубоко в традицию Unix.
Как мы все знаем, Linux — это переработанная версия Unix с открытым исходным кодом. Он также добавляет в микс свои собственные вещи. Это не побайтовый клон, но он явно перенял многие принципы проектирования и инженерные решения операционной системы Unix.
Хотя до сих пор только два дистрибутива Linux были сертифицированы как совместимые с POSIX и признаны официально принятыми в качестве реализаций Unix — EulerOS и Inspur K-UX — Linux почти полностью вытеснил Unix в деловом мире.
Все дистрибутивы Linux, по крайней мере, в своих основных утилитах, придерживаются философии Unix. Философия Unix заключает в себе видение своей новой операционной системы пионерами Unix. Его часто перефразируют так: «Пишите программы, которые хорошо справляются с одной задачей». Но это еще не все.
Одно из самых мощных нововведений заключалось в том, что программы должны генерировать выходные данные, которые можно использовать в качестве входных данных для других программ. Возможность гирляндной цепочки утилит командной строки вместе, используя поток вывода одной программы в качестве потока ввода для следующей программы в очереди, является чрезвычайно мощной.
Иногда вам нужно точно настроить или настроить вывод одной программы, прежде чем он достигнет следующей программы в очереди. Или, возможно, вы вводите данные не из инструмента командной строки Linux, а передаете текст из файла, который не был создан с учетом ваших конкретных потребностей.
Здесь tr
вступает в свои права. Он позволяет выполнять набор простых преобразований входного потока для создания выходного потока. Этот выходной поток можно перенаправить в файл, передать в другую программу Linux или даже в другой экземпляр tr
, чтобы применить к потоку несколько преобразований.
Замена символов
Команда tr
работает со своим входным потоком в соответствии с правилами. При использовании без каких-либо параметров командной строки действие tr
по умолчанию заключается в замене символов во входном потоке другими символами.
Команды tr
обычно требуют двух наборов символов. Первый набор содержит символы, которые будут заменены, если они будут найдены во входном потоке. Второй набор содержит символы, которыми они будут заменены.
Это работает следующим образом: вхождения первого символа в первом наборе будут заменены первым символом во втором наборе. Вхождения второго символа в первом наборе будут заменены вторым символом во втором наборе и так далее.
Этот пример будет искать букву «c» во входном потоке для tr
и заменять каждое вхождение буквой «z». Обратите внимание, что tr
чувствителен к регистру.
Мы используем echo
, чтобы поместить некоторый текст в tr
.
эхо abcdefabc | тр 'с' 'г'
Все вхождения «c» заменяются на «z», и новая строка записывается в окно терминала.
На этот раз мы будем искать две буквы, «а» и «с». Обратите внимание, что мы не ищем «ac». Мы ищем «а», затем ищем «в». Мы заменим любое вхождение «а» на «х», а любое вхождение «с» на «z».
эхо abcdefabc | тр 'ас' 'хз'
Чтобы это работало, у вас должно быть одинаковое количество символов в обоих наборах. Если вы этого не сделаете, вы получите предсказуемое, но, вероятно, нежелательное поведение.
echo 'Зовите меня Измаил.' | тр 'abcdjklm' '123'
В первом наборе символов больше, чем во втором. Буквы от «d» до «m» не имеют соответствующего символа во втором наборе. Они по-прежнему будут заменены, но все они будут заменены последним символом во втором наборе.
Вполне возможно, что в некоторых случаях это может быть полезно, но если вы хотите предотвратить это, вы можете использовать опцию -t
(truncate). Это заменяет только те символы, содержащиеся в первом наборе, которые имеют соответствующий символ во втором наборе.
echo 'Зовите меня Измаил.' | tr -t 'abcdjklm' '123'
Использование диапазонов и токенов
Набор один и набор два могут содержать диапазоны символов. Например, [az]
представляет все буквы нижнего регистра, а [AZ]
— все буквы верхнего регистра. Мы можем использовать это, чтобы изменить регистр потока текста.
Это преобразует входной поток в верхний регистр.
эхо "С практическими рекомендациями" | tr '[az]' '[AZ]'
Чтобы перевернуть регистр в другом направлении, мы можем использовать ту же команду, но с перестановкой диапазонов прописных и строчных букв в командной строке.
эхо "С практическими рекомендациями" | tr '[AZ]' '[az]'
Есть токены, которые мы можем использовать для некоторых распространенных случаев, с которыми мы можем захотеть сопоставить.
- [:alnum:] : Буквы и цифры.
- [:alpha:] : Только буквы.
- [:digit:] : Только цифры.
- [:blank:] : Вкладки и пробелы.
- [:space:] : Все пробелы, включая символы новой строки.
- [:graph:] : Все символы, включая символы, но не пробелы.
- [:print:] : Все символы, включая символы, включая пробелы.
- [:punct:] : Все знаки пунктуации.
- [:lower:] : строчные буквы.
- [:upper:] : буквы верхнего регистра.
Мы можем так же легко выполнять преобразования нижнего регистра в верхний и верхний регистр в нижний, используя токены.
эхо "С практическими рекомендациями" | tr '[:нижний:]' '[:верхний:]'
эхо "С практическими рекомендациями" | tr '[:верхний:]' '[:нижний:]'
Инвертирование спичек
Параметр -c
(дополнение) соответствует всем символам, кроме тех, что входят в первый набор. Эта команда преобразует все, кроме буквы «с», в дефис « -
».
эхо abcdefc | тр -с 'с' '-'
Эта команда добавляет букву «а» к первому набору. Все, кроме «а» или «с», преобразуется в дефис « -
».
эхо abcdefc | тр -с 'ас' '-'
Удаление и сжатие символов
Мы можем использовать tr
для полного удаления символов без какой-либо замены.
Эта команда использует параметр -d
(удалить) для удаления любых вхождений «a», «d» или «f» из входного потока.
эхо abcdefc | tr -d 'адф'
Это один из случаев, когда у нас есть только один набор символов в командной строке, а не два.
Другой случай, когда мы используем опцию -s
(сжатие-повторение). Этот параметр сокращает повторяющиеся символы до одного символа.
В этом примере повторяющиеся последовательности символов пробела будут сокращены до одного пробела.
эхо "abc de fc" | tr -s '[:blank:]'
Немного сбивает с толку то, что токен [:blank:]
представляет символ пробела, а токен [:space:]
представляет все формы пробелов, включая символы табуляции и новой строки.
В этом случае мы могли бы заменить [:blank:]
на [:space:]
и получить тот же результат.
эхо "abc de fc" | tr -s '[:пробел:]'
Удаление символов
Различия между [:blank:]
и [:space:]
становятся очевидными, когда мы удаляем символы. Для этого мы используем параметр -d
(удалить) и предоставляем набор символов, которые tr
будет искать во входном потоке. Все, что он находит, удаляется.
эхо "abc de fc" | tr -d '[:blank:]'
Пробелы удаляются. Обратите внимание, что мы получаем новую строку после записи выходного потока в окне терминала. Если мы повторим эту команду и используем [:space:]
вместо пробела, мы получим другой результат.
эхо "abc de fc" | tr -d '[:blank:]'
На этот раз мы не начинаем новую строку после вывода, командная строка упирается в нее. Это потому, что [:space:]
включает новые строки. Любые пробелы, символы табуляции и символы новой строки удаляются из входного потока.
Конечно, вы также можете использовать реальный символ пробела.
эхо "abc de fc" | тр -д ''
С таким же успехом мы можем удалять цифры.
эхо abcd123efg | tr -d '[:цифра:]'
Комбинируя параметры -c
(дополнение) и -d
(удаление), мы можем удалить все, кроме цифр.
эхо abcd123efg | tr -cd '[:цифра:]'
Обратите внимание, что все, кроме цифр, означает все буквы и все пробелы, поэтому мы снова теряем завершающий символ новой строки.
Объединение и разделение линий
Если мы заменим символы новой строки на пробелы, мы сможем разделить строку текста и поместить каждое слово на отдельной строке.
эхо 'один два три четыре' | тр ' ' '\n'
Мы также можем изменить разделитель, разделяющий слова. Эта команда заменяет пробелы двоеточиями :
.
эхо 'один два три четыре' | тр '' ':'
Мы можем найти любой используемый разделитель и заменить его символами новой строки, разделив трудный для чтения текст на более удобный для управления вывод.
Переменная среды пути представляет собой длинную строку из множества путей к каталогам. Двоеточие « :
» разделяет каждый путь. Мы изменим их на символы новой строки.
эхо $PATH
эхо $PATH | тр ":" "\n"
Это гораздо проще визуально разобрать.
Если у нас есть вывод, который мы хотим переформатировать в одну строку, мы тоже можем это сделать. Файл «lines.txt» содержит некоторый текст, по одному слову в каждой строке. Мы передадим это в tr
и преобразуем в одну строку.
файлы кошек.txt
линии кошки.txt | тр '\n' ' '
Использование tr с каналами
Мы можем использовать выходные данные tr
в качестве входных данных для другой программы или даже для самой tr
.
Эта команда использует tr
четыре раза.
- Первый
tr
удаляет любые дефисы «-» из ввода. - Второй
tr
сжимает любые повторяющиеся пробелы в одинарные пробелы. - Третий
tr
заменяет пробелы символами подчеркивания «_». - Четвертая и последняя
tr
преобразует строку в нижний регистр.
echo "Искаженный файл-nAMe.txt" | тр -д '-' | тр -с '' | тр '' '_' | tr '[:верхний:]' '[:нижний:]'
СВЯЗАННЫЕ С: Как использовать каналы в Linux
Просто как просто
Команда tr
великолепна, потому что она проста. Там не так много, чтобы узнать или запомнить. Но его простота может быть и его падением.
Не заблуждайтесь, часто вы обнаружите, что tr
позволяет вам делать то, что вам нужно, без необходимости обращаться к более сложным инструментам, таким как sed
.
Однако, если вы изо всех сил пытаетесь что-то сделать с помощью tr
и обнаружите, что строите длинные последовательные цепочки команд, вам, вероятно, следует использовать sed
.