Как использовать команду Linux tr

Опубликовано: 2023-05-17
Начальный экран Ubuntu Linux на ноутбуке
Джордан Глор / How-To Geek
Команда tr выполняет преобразование потока текста, создавая на выходе новый поток. Вы можете заменять, удалять или преобразовывать символы в соответствии с правилами, установленными в командной строке.

Вам нужен простой метод управления потоком текста в 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 | тр 'с' 'г' 

Замена одного символа на tr

Все вхождения «c» заменяются на «z», и новая строка записывается в окно терминала.

На этот раз мы будем искать две буквы, «а» и «с». Обратите внимание, что мы не ищем «ac». Мы ищем «а», затем ищем «в». Мы заменим любое вхождение «а» на «х», а любое вхождение «с» на «z».

 эхо abcdefabc | тр 'ас' 'хз' 

Удаление двух букв с помощью tr

Чтобы это работало, у вас должно быть одинаковое количество символов в обоих наборах. Если вы этого не сделаете, вы получите предсказуемое, но, вероятно, нежелательное поведение.

 echo 'Зовите меня Измаил.' | тр 'abcdjklm' '123' 

Использование несбалансированных наборов символов с tr

В первом наборе символов больше, чем во втором. Буквы от «d» до «m» не имеют соответствующего символа во втором наборе. Они по-прежнему будут заменены, но все они будут заменены последним символом во втором наборе.

Вполне возможно, что в некоторых случаях это может быть полезно, но если вы хотите предотвратить это, вы можете использовать опцию -t (truncate). Это заменяет только те символы, содержащиеся в первом наборе, которые имеют соответствующий символ во втором наборе.

 echo 'Зовите меня Измаил.' | tr -t 'abcdjklm' '123' 

Использование несбалансированных наборов символов с tr с опцией усечения

Использование диапазонов и токенов

Набор один и набор два могут содержать диапазоны символов. Например, [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 'адф' 

Удаление нескольких символов из строки текста с помощью tr

Это один из случаев, когда у нас есть только один набор символов в командной строке, а не два.

Другой случай, когда мы используем опцию -s (сжатие-повторение). Этот параметр сокращает повторяющиеся символы до одного символа.

В этом примере повторяющиеся последовательности символов пробела будут сокращены до одного пробела.

 эхо "abc de fc" | tr -s '[:blank:]' 

Изменение повторяющихся последовательностей символов на одно вхождение символа с помощью tr

Немного сбивает с толку то, что токен [:blank:] представляет символ пробела, а токен [:space:] представляет все формы пробелов, включая символы табуляции и новой строки.

В этом случае мы могли бы заменить [:blank:] на [:space:] и получить тот же результат.

 эхо "abc de fc" | tr -s '[:пробел:]' 

Изменение повторяющихся последовательностей символов на одно вхождение символа с помощью tr

Удаление символов

Различия между [:blank:] и [:space:] становятся очевидными, когда мы удаляем символы. Для этого мы используем параметр -d (удалить) и предоставляем набор символов, которые tr будет искать во входном потоке. Все, что он находит, удаляется.

 эхо "abc de fc" | tr -d '[:blank:]' 

Удаление пробелов (пробелов) из строки текста с помощью tr

Пробелы удаляются. Обратите внимание, что мы получаем новую строку после записи выходного потока в окне терминала. Если мы повторим эту команду и используем [:space:] вместо пробела, мы получим другой результат.

 эхо "abc de fc" | tr -d '[:blank:]' 

Удаление пробелов из строки текста с помощью tr

На этот раз мы не начинаем новую строку после вывода, командная строка упирается в нее. Это потому, что [:space:] включает новые строки. Любые пробелы, символы табуляции и символы новой строки удаляются из входного потока.

Конечно, вы также можете использовать реальный символ пробела.

 эхо "abc de fc" | тр -д '' 

Удаление пробелов из строки текста путем указания символа пробела с помощью tr

С таким же успехом мы можем удалять цифры.

 эхо abcd123efg | tr -d '[:цифра:]' 

Удаление цифр из строки текста с помощью tr

Комбинируя параметры -c (дополнение) и -d (удаление), мы можем удалить все, кроме цифр.

 эхо abcd123efg | tr -cd '[:цифра:]' 

Удаление всего, кроме цифр, из строки текста с помощью tr

Обратите внимание, что все, кроме цифр, означает все буквы и все пробелы, поэтому мы снова теряем завершающий символ новой строки.

Объединение и разделение линий

Если мы заменим символы новой строки на пробелы, мы сможем разделить строку текста и поместить каждое слово на отдельной строке.

 эхо 'один два три четыре' | тр ' ' '\n' 

Разделение строки текста на одно слово в строке с помощью tr

Мы также можем изменить разделитель, разделяющий слова. Эта команда заменяет пробелы двоеточиями : .

 эхо 'один два три четыре' | тр '' ':' 

Изменение разделителя слов с пробелов на двоеточия с помощью tr

Мы можем найти любой используемый разделитель и заменить его символами новой строки, разделив трудный для чтения текст на более удобный для управления вывод.

Переменная среды пути представляет собой длинную строку из множества путей к каталогам. Двоеточие « : » разделяет каждый путь. Мы изменим их на символы новой строки.

 эхо $PATH
 эхо $PATH | тр ":" "\n" 

Разделение переменной среды $PATH на отдельные пути к каталогам, по одному на строку, с помощью tr

Это гораздо проще визуально разобрать.

Если у нас есть вывод, который мы хотим переформатировать в одну строку, мы тоже можем это сделать. Файл «lines.txt» содержит некоторый текст, по одному слову в каждой строке. Мы передадим это в tr и преобразуем в одну строку.

 файлы кошек.txt
 линии кошки.txt | тр '\n' ' ' 

Объединение многострочного ввода в одну строку текста с помощью tr

Использование tr с каналами

Мы можем использовать выходные данные tr в качестве входных данных для другой программы или даже для самой tr .

Эта команда использует tr четыре раза.

  • Первый tr удаляет любые дефисы «-» из ввода.
  • Второй tr сжимает любые повторяющиеся пробелы в одинарные пробелы.
  • Третий tr заменяет пробелы символами подчеркивания «_».
  • Четвертая и последняя tr преобразует строку в нижний регистр.
 echo "Искаженный файл-nAMe.txt" | тр -д '-' | тр -с '' | тр '' '_' | tr '[:верхний:]' '[:нижний:]' 

Конвейер из четырех экземпляров tr

СВЯЗАННЫЕ С: Как использовать каналы в Linux

Просто как просто

Команда tr великолепна, потому что она проста. Там не так много, чтобы узнать или запомнить. Но его простота может быть и его падением.

Не заблуждайтесь, часто вы обнаружите, что tr позволяет вам делать то, что вам нужно, без необходимости обращаться к более сложным инструментам, таким как sed .

Как использовать команду sed в Linux
СВЯЗАННЫЕ Как использовать команду sed в Linux

Однако, если вы изо всех сил пытаетесь что-то сделать с помощью tr и обнаружите, что строите длинные последовательные цепочки команд, вам, вероятно, следует использовать sed .