Текстом в терминале GNU/Linux управляет несколько программ. Их отличие заключается в специфике обработки данных. Объединяя результат работы этих утилит, можно совершать эффективные действия с текстовой информацией. Одной из таких программ является консольная команда tr, которая используется для замены, замещения или удаления символов из стандартного ввода, отправляя результат на стандартный вывод.
Утилита устанавливается вместе практически со всеми дистрибутивами GNU/Linux. В этой статье рассмотрим команду tr Linux, её синтаксис и применение на практике.
Содержание статьи
Синтаксис команды tr в Linux
Программа обрабатывает текст посимвольно. По умолчанию у её синтаксиса следующий вид (квадратные скобки указывают, что аргумент не обязателен):
tr [КЛЮЧ]... НАБОР1 [НАБОР2]
Всего доступно 4 ключа для уточнения операции над символами:
Ключ | Длинный вариант | Значение |
-c, -C | --complement | Сначала получить дополнение НАБОРА1 |
-d | --delete | Удалить знаки из НАБОРА2, не превращать |
-s | --squeeze-repeats | Замещать последовательность знаков, которые повторяются, из перечисленных в последнем НАБОРЕ, на один такой знак |
-t | --truncate-set1 | Сначала сократить НАБОР1 до размеров НАБОРА2 |
НАБОРЫ указываются как символьные строки. В большинстве случаев символы представляют сами себя. Полный набор опций представлен в следующей таблице:
Опция | Значение |
\HHH | Знак в восьмеричной кодировке (с трех цифр ННН) |
\\ | Обратный слэш |
\b | Забой |
\f | Перевод страницы |
\n | Начать с новой строки |
\r | Возврат каретки |
\t | Горизонтальная табуляция |
\v | Вертикальная табуляция |
ЗНАК1-ЗНАК2 | Все знаки от ЗНАК1 до ЗНАК2 в порядке возрастания |
[ЗНАК*] | ЗНАК заполняет НАБОР2 до длины НАБОРА1 |
[ЗНАК*ЧИСЛО] | Указанное ЧИСЛО одинаковых ЗНАКОВ; ЧИСЛО восьмиричных, если начинается с 0 |
[:alnum:] | Все буквы и цифры |
[:alpha:] | Все буквы |
[:blank:] | Все горизонтальные пробельные символы |
[:cntrl:] | Все управляющие знаки |
[:digit:] | Все цифры |
[:graph:] | Все печатаемые знаки, исключая пробел |
[:lower:] | Все маленькие буквы |
[:print:] | Все печатаемые знаки, включая пробел |
[:punct:] | Все знаки пунктуации |
[:space:] | Все вертикальные и горизонтальные пробельные знаки |
[:upper:] | Все большие буквы |
[:xdigit:] | Все шестнадцатиричные цифры |
[=ЗНАК=] | Все знаки, эквивалентные ЗНАКУ |
Превращение осуществляется, если не указано -d для обоих НАБОРОВ. -t можно использовать только во время превращения. Если нужно, НАБОР2 будет расширен до размеров НАБОРА1 повторением последнего символа. Лишние символы НАБОРА2 будут пропущены. Гарантированно расширяются в порядке возрастания только [:lower:] и [:upper:]. Использованные символы в НАБОРЕ2 во время превращения можно применять для определения превращения регистра только в парах. -s использует последний указанный набор. Уплотнение происходит после превращения или удаления.
Примеры использования tr
1. Замена символов через аргументы
Программа по умолчанию работает со стандартным вводом/выводом.
Пример 1. Заменить все x на z.
tr x z
Далее следует ввести строку и нажать Enter. Ниже будет выведен обработанный результат и представлена возможность повторного ввода.
Для выхода из программы нажмите Ctrl + D.
Пример 2. Удалить все буквы в нижнем регистре.
tr -d [:lower:]
Пример 3. Уплотнить повторяющиеся буквы большого и малого регистров.
tr -s [:upper:][:lower:]
2. Работа с потоками
Команда tr может принимать на вход результат работы другой программы с использованием пайпа.
Пример 4. Вывести первые три строки файла /etc/passwd, заменив двоеточия (используемые в качестве разделителя данных) на пробелы.
head -n3 /etc/passwd | tr ':' ' '
Также можно использовать перенаправление потока ввода и вывода.
Пример 5. Заменить цифры IP-адреса файла addresses2 на буквы a, и результат записать в файл addresses3.
tr [0-9] a < addresses2 > addresses3
Выводы
Команда tr - это качественный инструмент для работы с символами строк в терминале GNU/Linux. С её помощью можно редактировать информацию со стандартного или перенаправленного потока ввода и выводить результат на экран или в файл.
Меня зовут Шура, мне 44 года. Сижу на GNU/Linux c 2003 года. На данный момент остановился на XUbuntu...
)))))))+++
Меня зовут Феликс, мне over дохрена года. Сижу рядом с GNU/Linux начиная с Mandrake 9.0 и ASPLinux Ural. На данный момент на моём десктопе благополучно застрял Debian stretch в исполнении LXDE, а на сервере Debian stretch в консольном виде, которые полностью меня устраивают и дарят море позитивных эмоций и полноценную функциональную среду для разработки несложного web и повседневных хомячковых задач типа Интернетов и мультимедия...
А чо, ШУРА запустил флэшмоб...
Скорее каминг-аут)))
Моё имя -- Александр. Мне 56 лет. Работаю с Линуксом с 2008 года. Начинал свой путь с Ubunt-ы. Работал на ней, пока космонавт не скурвился. На данный момент юзаю исключительно Debian.
Занимаюсь разработкой электронных устройств на базе микроконтроллеров (МК) -- AVR, MSP430, STM32. Мои "ходовые" инструменты: arm-none-eabi-*, st-link, avr-gcc, avr-dude, gcc-msp430, mspdebug, gnuplot, Python3, KiCAD, штатный текстовый редактор pluma и утилита make.
Абсолютно не вижу никакой необходимости прибегать к Винде. Всё работы, которыми я занимаюсь и на работе, и дома, -- всё делаю в Линуксе и не вижу никаких препятствий. Как раз наоборот -- коллеги по работе, у которых установлена Вин-10, завидуют мне: "Пришел, включил и начал работать. А у меня то обновление начнётся, то ещё какая-нибудь засада..."
Чем глубже вы знаете технологии и подходы в Виндовсе, тем сложнее вам будет работать в Линуксе. Поэтому изучайте что-то одно, не пытайтесь усидеть на двух стульях. Из-за всеобщего дефицита времени вы не сможете одновременно знать два типа операционных систем так же глубоко, какую-то одну из них. По мне так лучше знать что-то одно, но на уровне эксперта или уважаемого профессионала, чем много, но на уровне дилетанта или домохозяйки.
Идите своим путём и не слушайте, что вам втирает реклама. Реклама -- это двигатель торговли. Реклама -- это значит, вам хотят что-то впарить против вашего согласия. Чтобы получить ваше согласие, вам нужно задурить мозги.
Замечательный совет! Особенно для админа которому одновременно необходимо администрить почтовый и proxy сервера на Linux и котроллер домена на Win Server.
PS Ах, да! Я ведь и забыл есть же ФриИБА!
Что-то я не понял. Могу я с помощью команды tr изменить все даты в определенном файле word и exsel или во всех файлах, лежащих в данном каталоге???
про файл word говорить ничего не буду, а вот в exsel точно нет D)))
Автору сайта:
Антон, пишите всё, что считаете нужным, и что Вам интересно. Чем больше мы говорим о Линуксе, тем шире его аудитория, тем больше будет его экосистема.
Каждый день в Линукс приходят новые люди, которые -- понятное дело -- в нём ещё слабо ориентируются. Совсем необязательно писать статьи, посвященные применению Линукса, на уровне эксперта для продвинутых. Начинающим тоже нужно где-то получать знания.
Так что всё, что Вы делаете, -- все идёт на пользу обществу.
Поэтому примите от меня самые лучшие слова благодарности!
Спасибо!
Благодарю за отзыв и поддержку)
Только он не автор сайта, а автор статьи. Пока что первенство принадлежит администратору, Сергею =)
А есть ли какие инструменты в unix или windows, которые позволяют найти и изменить определенный текст в куче файлов таблицы excel. Просто ежемесячно приходится писать кучу отчетов, отчеты хранятся в формате MS Excel (.xlsx) в одной папке, можно их перевести .ods.
Проблема в том, что ежемесячно приходится править ручками во всех файлах дату и иногда фамилии ответственных лиц (если кто-то в отпуске или на больничном). Это можно как-то выполнить одной командой или как-то автоматизировать процесс...
Одного инструмента точно нет. Каждая утилита делает что-то одно. Тут просто комбинировать надо. Искусство в том, чтобы знать эти компоненты. Думаю, не обойдется без использования touch, gawk, find
Для этого предназначены макросы Excel. Они пишутся на языке программирования VBA. Я в своё время проходил стажировку по этой теме, и точно могу сказать, что это можно сделать с помощью данного инструмента, но навскидку не скажу, как именно. Но в реальности самое серьёзное, что я делал в Excel - это кодогенератор с использованием стандартных функций.
ОШИБКА в описании:
Написано:
-d --delete Удалить знаки из НАБОРА2, не превращать
Должно быть:
-d --delete Удалить знаки из НАБОРА1, не превращать