#理解:
1、tr的本意是translate,其出发点是针对一个一个独立的字符(对比sed是针对行流),将1个字符翻译(或可理解为替换)成另1个字符;在此基础上,还可实现对重复字符的删除、压缩(将"AAA"变成"A")。对于删除和压缩,可以理解为是从翻译功能衍生出来的,实现了从tranlate向transform的转变。
2、tr常用的功能是实现字符转换(比如大小写字母转换)、删除不需要的字符(比如将多行合并成1行)、压缩字符(比如多余的空白行)。
3、sed的很多功能可通过tr更简单的来应用。
#工作原理:
首先接受标准输入stdin,再实现set2(可理解位字符集或字符组,再简单点就是排列有序的多个字符)一一映射到set1,最后将结果输出到标准输出stdout上。
举例说明
stdin是12345
set1='0123456789'
set2='9876543210'
映射关系分析:set2中的第一个字符"9"会映射到set1中对应的第一个字符"0"上,套用tr的说法就是,"0"is translated to "9"("0"被翻译成了"9")。接着,"1"被翻译为"8","2"被翻译为"7","3"被翻译为"6","4"被翻译为"5","5"被翻译为"4"。
这样一来,通过映射实现了翻译,最后stdout的结果是87654。
例1:
- [root@localhost ~]# echo 12345 | tr '0-9' '9876543210'
- 87654
#语法:
tr [options] set1 set2
参数:
-t 表示替换,为默认选项。
-d delete,删除SET1中所有的字符,不转换
-s squeeze-repeats,压缩SET1中重复的字符
-c complement,用SET2替换SET1中没有包含的字符
set字符集描述直接用单引号,先不要考虑正则,'0-9'是'0123456789'的缩写形式,描述更加方便。
例2:
- [root@localhost ~]# echo 87654 | tr '9876543210' '0-9'
- 12345
可以看出,通过例1和例2,就可以实现简单的加解密功能。
#应用
进一步,还可实现更强大的ROT13(http://zh.wikipedia.org/wiki/ROT13)加解密,加解密用同样的set2到set1的映射(高手可以理解为加解密用同一个函数)。
例3:ROT13加解密
- [root@localhost ~]# echo "I love you." | tr \
- > 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' \
- > 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'
- V ybir lbh.
- [root@localhost ~]# echo "V ybir lbh." | tr \
- > 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' \
- > 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'
- I love you.
其他用法:
例4: 删除功能
- [root@localhost ~]# echo -e "this\n\nis\n\ntest" | tr -d '\n'
- thisistest[root@localhost ~]#
例5:压缩功能
- [root@localhost ~]# echo -e "this\n\nis\n\ntest" | tr -s '\'
- this is test [root@localhost ~]#
例6:互补功能
- [root@localhost ~]# echo -e "this\n\nis\n\ntest" | tr -c 'a-z' ' '
- this is test [root@localhost ~]#