tr只能通过stdin(标准输入),而无法通过命令行参数来接受输入
tr [options] set1 set2
将来自stdin的输入字符从set1映射到set2,然后将输出写入stdout(标准输出)。set1和set2是字符类或字符集。如果两个字符集的长度不相等,那么set2会不断重复其最后一个字符,直到长度与set1相同。如果set2的长度大于set1,那么在set2中超出set1长度的那部分字符则全部被忽略。
1. 将输入字符由大写转换成小写
$ echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z'
2. 简单的加密解密
$ echo 12345 | tr '0-9' '9876543210'
87654 # 已加密
$ echo 87654 | tr '9876543210' '0-9'
12345 # 已解密
3.ROT13 加密算法
$ echo "tr came, tr saw, tr conquered." | tr 'a-zA-Z' 'n-za-mN-ZA-M'
得到输出:
ge pnzr, ge fnj, ge pbadhrerq.
对加密后的密文再次使用同样的ROT13函数,我们采用:
$ echo ge pnzr, ge fnj, ge pbadhrerq. | tr 'a-zA-Z' 'n-za-mN-ZA-M'
得到输出:tr came, tr saw, tr conquered.tr
4.将制表符转换成空格
$ tr '\t' ' ' < file.txt
其他功能:
1. 用tr删除字符
$ cat file.txt | tr -d '[set1]'
#只使用set1,不使用set2
[hadoop@aliyun1 ~]$ echo "Hello 123 world 456" | tr -d '0-9'
Hello world
2. 字符集补集
我们可以利用选项-c来使用set1的补集。下面的命令中,set2是可选的:
tr -c [set1] [set2]
set1的补集意味着这个集合中包含set1中没有的所有字符。
最典型的用法是从输入文本中将不在补集中的所有字符全部删除。
[hadoop@aliyun1 ~]$ echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'
1 2 4
[hadoop@aliyun1 ~]$ echo hello 1 char 2 next 4 | tr -d -c '0-9\n'
124
[hadoop@aliyun1 ~]$ echo hello 1 char 2 next 4 | tr -d -c '0-9'
124[hadoop@aliyun1 ~]$ echo hello 1 char 2 next 4 | tr -d -c ''
[hadoop@aliyun1 ~]$
3.用tr压缩字符
经常需要从事的一项任务就是压缩空白字符。
tr的-s选项可以压缩输入中重复的字符
[hadoop@aliyun1 ~]$ echo "GNU is not UNIX. Recursive right ?" | tr -s ' '
GNU is not UNIX. Recursive right ?
用一种巧妙的方式用tr将文件中的数字列表进行相加:
[hadoop@aliyun1 ~]$ cat sum.txt
1
2
3
4
5
[hadoop@aliyun1 ~]$ cat sum.txt | echo $[ $(tr -s '\n' '+') 0]
15
4. 字符类tr可以像使用集合一样使用各种不同的字符类,这些字符类如下所示:
alnum:字母和数字。
alpha:字母。
cntrl:控制(非打印)字符。
digit:数字。
graph:图形字符。
lower:小写字母。
print:可打印字符。
punct:标点符号。
space:空白字符。
upper:大写字母。
xdigit:十六进制字符。
例如:
[hadoop@aliyun1 ~]$ echo abcdEFG | tr [:lower:] [:upper:]
ABCDEFG