指令名称:
tr - 字符的转换与删除
说明:
这指令是个字符过滤器,数据由标准输入流入,经过指令的指定转换后,再导向标准输出。感觉上很像一个筛子。
基本上,指令一次处理一个字符,所以不具备识别"英文单字"这种特定顺序的字符组合。目前这个指令也不适合处理中文档案。
选项:
-c, --complement
反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换
-d, --delete
删除指令字符
-s, --squeeze-repeats
缩减连续重复的字符成指定的单个字符
-t, --truncate-set1
削减 SET1 指定范围,使之与 SET2 设定长度相等
--help
显示程序用法信息
--version
显示程序本身的版本信息
以下是特定的字符设定(SETs),与他们所代表的意义
\NNN 8进位的 ASCII 码倒斜线(backslash)
\a 警示声 (BEL)
\b 光标倒退一格字符(backspace)
\c 在行尾不加上换行字符(同 -n 选项的作用)
\f 换页(form feed)
\n 换行(new line)
\r 游标回归行首(carriage return)
\t 水平跳格(horizontal tab)
\v 垂直跳格(vertical tab)
\\
CHAR1-CHAR2
:字符范围从 CHAR1 到 CHAR2 的指定,范围的指定以 ASCII 码的次序为基础,只能由小到大,不能由大到小。
[CHAR*] :这是 SET2 专用的设定,功能是重复指定的字符到与 SET1 相同长度为止
[CHAR*REPEAT]
:这也是 SET2 专用的设定,功能是重复指定的字符到设定的 REPEAT 次数为止(REPEAT 的数字采 8 进位制计算,以 0 为开始)
[:alnum:] :所有字母字符与数字
[:alpha:] :所有字母字符
[:blank:] :所有水平空格
[:cntrl:] :所有控制字符
[:digit:] :所有数字
[:graph:] :所有可打印的字符(不包含空格符)
[:lower:] :所有小写字母
[:print:] :所有可打印的字符(包含空格符)
[:punct:] :所有标点字符
[:space:] :所有水平与垂直空格符
[:upper:] :所有大写字母
[:xdigit:] :所有 16 进位制的数字
[=CHAR=] :所有符合指定的字符(等号里的 CHAR,代表你可自订的字符)
实例说明:
以下两种型态是运用 tr 指令常见的模式。
# cat file-A | tr [A-Z] [a-z]
# tr [A-Z] [a-z] < file-A > file-a
基本上 tr 属于搭配型指令,因此数据通常藉由 pipeline(符号"|") 或 input redirection(符号"<")来导入,其指令本身并不支持档案的呼叫。导入的数据经由 tr 过滤转换后会导向标准输出显示在屏幕上。
大小字母的转换
tr 指令非常适合用来做大小写字母的转换。
# tr [:upper:] [:lower:] < file-A > file-a
# tr [:lower:] [:upper:] < file-b> file-B
第一行是将大写字母转成小写字母,第二行则是小写字母转成大写字母。两行使用的语法则是特定的写法,其实也可以改写如下
# tr 'A-Z' 'a-z' < file-A > file-a
# tr 'a-z' 'A-Z' < file-b> file-B
这种写法比较简短,我个人也比较惯用。其实用这种写法有一个好处,当我想将一个文本文件的大小写全部反过来时,这个语法可以做到。来看下面的例子
# cat file-Aa
SEE ALSO
The full documentation for tr is maintained as a Texinfo manual.
If the info and tr programs are properly installed at your site,
the command
info tr
should give you access to the complete manual.
#
这是一个普通的文本文件,使用 tr 可以容易地将整个档案的大小写字母反过来,如下
# tr 'a-zA-Z' 'A-Za-z' < file-Aa | tee file-aA
see also
tHE FULL DOCUMENTATION FOR TR IS MAINTAINED AS A tEXINFO MANUAL.
iF THE INFO AND TR PROGRAMS ARE PROPERLY INSTALLED AT YOUR SITE,
THE COMMAND
INFO TR
SHOULD GIVE YOU ACCESS TO THE COMPLETE MANUAL.
#
呀喝!猪羊变色。新档案 file-aA 的大写的字母转成小写字母。
简单的字母代替文字加密
在多人多任务的 UNIX 或 Linux OS 中,一般使用者其实很难保有隐私,因为永远还有一个人可以查看管理你的私人档案,那就是你的系统管理者。所以当你需要在这样一个公共空间里,保有一点基本的自我隐私时,文件最好为它加密。
tr 可以产生趣味大于实质用途的加密,方法简单如下
# tr 'a-z ' 'qazwsxedcrfvtgbyhnujmikolp' < file-Aa | tee file-SAa
SEEpALSO
TdspxjffpwgzjvstuqucgtpxghpuhpcnpvqctuqctswpqnpqpTskctxgpvqtjqf.p
Ixpudspctxgpqtwpuhpbhgehqvnpqhspbhgbshfopctnuqffswpqupogjhpncus,p
udspzgvvqtw
pctxgpuh
ndgjfwpecmspogjpqzzsnnpugpudspzgvbfsuspvqtjqf.p
#
为了举例方便,密码字母集我只设定小写字母。如果 真想用的话,最好将整个 ASCII 全部代替会比较理想。同时为了安全起见,指令不可在交谈模式下使用,因为程序有可能正被观察中,同时也必须注意history功能是否储存的密码字母集。 最好的方式是将程序写成 script 来执行,当然密码字母集不可包含在其中。
解密的过程只需将正确的密码字母集放到 SET1 将替换的程序反过来即可...
# tr 'qazwsxedc rfvtgbyhnujmikolp' 'a-z ' < file-SAa
SEE ALSO
The full documentation for tr is maintained as a Texinfo manual.
If the info and tr programs are properly installed at your site,
the command
info tr
should give you access to the complete manual.
#
这种加密法适合 100 个字母以内的简短讯息使用,绝对可以蒙过一些小Q蛋,只是碰上频率分析法专家会被笑而已。
压缩过多的连续空白或空行
# tr -s ' ' ' ' < file
对空白过多的文本文件,这个做法可以简单迅速地解决。如果对象是空行,也可以使用
# tr -s '\n' '\n' < file
所以相似的问题,都可藉由 -s 选项做有效的缩减。
让转换参数做1对1的有效对应
有时一不小心 SET1 的范围指定多过对应到 SET2 的指定时,执行结果会有小问题,来看下例
# cat file-a
a
ab
abc
abcd efgh ijkl
# tr 'a-z' '012' < file-a
0
01
012
0122 2222 2222
也就是说,SET1 对应到 SET2 的关系变成 a 转换成 0, b 转换成 1, c-z 转换成 2。通常,最后的 c-z 对应多半是设定时没有预料到的对应关系。
要避免或限制这种效应,可以加上 -t 选项
# tr -t 'a-z' '012' < file-a
0
01
012
012d efgh ijkl
因 -t 选项,使对应关系改变成 a 转换成 0, b 转换成 1, c 转换成 2, d-z 因 SET2 没有设定而不做任何转换对应。