tr只能通过标准输入stdin接受输入,无法接受参数,它可以将一组字符转变成另一组字符。

使用的格式:

$ ... | tr [options] set1 set2

tr将来自stdin的字符从set1映射到set2,并输入到stdout。set1和set2可以是字符类或者字符集,如果set2的长度小于set1,那么set2的最后一个字符会重复到与set1的长度相等,如果set1的长度小于set2,那么set2中超出set1的部分会被忽略。

tr的实际应用:

$ echo "HELLO WORLD" | tr 'A-Z' 'a-z'

上面这段代码就把大写字符转换成了小写字符。

字符集是可以自己定制的,例如'BHU-}','a-ch-l1-3'这样都是合法集合,像'\n','\t'这种特殊字符也可以使用。

所以,tr是可以用来对文件进行简单压缩的,例如web前端的js、css和html文件,实际上都可以用tr命令去除多余空格和空白行,来实现最基本的压缩。


tr还可以用来加密和解密

$ tr 12345 | tr '0-9' '4612375908'

输出是61237

$ echo 61237 | tr '4612375908' '0-9'

输出是12345

这样我们实现了一个简单的加密和解密过程。

一个比较有名的ROT13加密,就可以使用tr来实现,关于ROT13大家可以自行百度。

$ echo 'Hello World' | tr 'A-Za-z' 'N-ZA-Mn-za-m'

输出Uryyb Jbeyq

$ echo 'Uryyb Jbeyq' | tr 'A-Za-z' 'N-ZA-Mn-za-m'

输出Hello World

大家可以看到,加密和解密是一样的。


tr删除字符

使用-d参数可以删除指定的字符集合。

$ echo 'He2l2lo W1or3ld' | tr -d '0-9'

输出Hello World

使用-c可以使用set1的补集

$ echo 'He2l2lo W1or3ld' | tr -d -c '0-9'

输出2213


tr压缩文件

例如我们有一个简单的js文件test.js


var a=1;


console.log(a);


我们可以使用以下命令:

$ cat test.js | tr -d '\n' | tr -s ' '

第一次tr我们删除换行符,第二次使用-s参数删除重复的空白,输出如下:

var a=1; console.log(a);

我们可以使用标准输出到另一个文件:

$ cat test.js | tr -d '\n' | tr -s ' ' > test.min.js

这样就实现了文件的简单压缩,当然更好的压缩还包括去除注释等等。


tr可以使用的字符类

alnum 字母和数字

alpha 字母

control 控制字符

digit 数字

graph 图形字符

lower 小写字母

upper 大写字母

print 可打印字符

punct 标点符号

space 空白字符

xdigit 十六进制字符

适用方法:

$ ... | tr '[:lower:]' '[:upper:]'