**Прокачиваемся в tr** Более глубокий взгляд на tr `cat file | tr [:lower:] [:upper: ] Сегодня у нас на разборе одна из культовых утилит "**tr**". Используется она для форматирования текста: удаления и замены символов. Чаще всего можно встретить в паре со сторонними командами, которые выводят в **stdout** текстовый поток: **cat, head, echo** и т.д. Команда имеет следующий вид: $ tr флаг SET1 [SET2] Сетами представлены наборы символов, с которыми **tr** будет работать. Второй набор не всегда используется.  Команда разбирает текст посимвольно и выполняет операцию для каждого элемента отдельно. Флаги команды tr: 1) **-d (--delete)**: удаляет элементы из первого набора: $ echo "Hello 123 world" | tr -d ' a-zA-Z' 123 1) **-c (--complement)**: обработать каждый символ, который не входит в набор "**SET1**": $ echo "Hello 123 world" | tr -cd 'a-zA-Z\n' Helloworld В примере мы удалили все символы, которые не входят в перечисление '**a-zA-Z\n**'; Таким же макаром можно все буквы удалить и оставить только цифры: $ cat customer.csv USA,1234567890 Canada,0987654321 $ cat customer.csv | tr -cd '0-9\n' 1234567890 0987654321 1) **-s (--squeeze-repeats)**: cжимает повторяющиеся символы из первого набора до одного: $ echo "Hello    World" | tr -s ' ' Hello World 1) **-t (--truncate-set1)**: обрезает первый набор до длины второго: $ echo "abcdef" | tr -t 'abcdef' '123' 123def Если длина первого набора больше и мы не указываем флаг, каждый последующий его символ, который (**по номеру > конец "SET2"**), будет заменен: $ echo "abcdef" | tr 'abcdef' '123' 123333 При своем дефолтном поведении, программа заменяет символы из "**SET1**" на элементы "**SET2**": $ echo "Hello World" | tr 'a-z' 'A-Z' HELLO WORLD Команда умеет парсить шаблоны: **[:upper:], [:lower:]** и т.д. Детальнее можно ознакомиться в мануале: $ echo "hello world" | tr [:lower:] [:upper:] HELLO WORLD Данные на вход можно получить и через файлик. Для этого мы используем перенаправление: $ cat infile www.baeldung.com $ tr 'a-z' 'A-Z' < infile WWW.BAELDUNG.COM Измененные данные нужно куда-то записать? Правильно, перенаправляем вывод: $ tr 'a-z' 'A-Z' < infile > outfile