1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
**Прокачиваемся в 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
|