SHELL脚本--tr命令⽤法和特性全解
1.1简介
tr主要⽤于将从标准输⼊读取的数据进⾏结果集映射、字符压缩和字符删除。它⾸先会将读取的标准输⼊进⾏排序然后按照某种⽅式换⾏,然后再根据给出的命
令⾏参数做相关处理。
tr[options][SET1][SET2]
-c:使⽤SET1的补集
-d:删除字符
-s:压缩字符
-t:截断SET1,使得SET1的长度和SET2的长度相同
1.2tr映射
如果同时指定了SET1和SET2,则是将SET1的符号按位置⼀⼀对应映射为SET2中的符号。换句话说,就是对应替换。
tr接收到stdin后⾸先会把将结果按照某种标记符号进⾏换⾏。例如:
[root@xuexitmp]#ls#其中""是带有空格的⽂件名
tvmware-root
将空格替换为制表符。因为tr⼀接收到数据就进⾏了排序换⾏,所以结果仅只替换了""中的空格。
[root@xuexitmp]#ls|tr"""t"#结果是排序后换⾏的
a
b
c
d
logdir
one
shdir
test
vmware-root
之所以说tr是映射⽽不是替换,是因为两个结果集替换的时候符号位置是⼀⼀对应的。如果SET1⽐SET2短,则SET2多余的部分会被忽略,如果SET1⽐SET2
长,POSIX认为这是不合理的,但也能执⾏,只不过结果有些意料之外,见下⽂。例如下⾯的例⼦,因为SET1中只有⼀个符号"n",于是替换时SET2中的Y被
忽略。
[root@xuexitmp]#ls|tr"n""XY"
stXvmware-rootX
这样就可以实现简单的加密和解密。
[root@xuexitmp]#echo"12345"|tr"0-9""9876543210"#加密
87654
[root@xuexitmp]#echo"87654"|tr"0-9""9876543210"#解密
12345
上⾯的过程是将管道左边的12345对应到0-9的展开式,并将对应位映射到SET2的数字上。解密也是同理。
有⼀种ROT13加密算法,它的加密和解密使⽤⼀套字符。它的SET1的字母位和SET2的字母位完全反向成对。例如SET1指定符号是"axy",如果SET2想将其对
应为"opq",则须将SET1扩展为"axyopq",SET2扩展为"opqaxy",最终是(a,x,y,o,p,q)和(o,p,q,a,x,y),这样(a,o)和(o,a)就能成功配对。再将其扩展为
A-Z和a-z,就是所谓的ROT13加密,甚⾄还可以将0-9也加上去和9-0对应。下⾯是SET1和SET2的对应式。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm
现在加密“Iloveyou”
[root@xuexitmp]#echo"Iloveyou"|tr"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz""NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"
Vybirlbh
将“Vybirlbh”解密。
[root@xuexitmp]#echo"Vybirlbh"|tr"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz""NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"
Iloveyou
1.3完全对应的替换
默认情况下,当指定的SET1⽐SET2字符长时,从最后⼀个对应的位置开始,SET1的剩余字符都和SET2的最后⼀个字符对应。假如SET1=[1234],SET2=
[abc],则3对应c,4也对应c,此时如果tr的操作对象中出现3或者4都会被替换为c。
使⽤-t可以先截断SET1⽐SET2中长的字符,例如上⾯截断多余的4,SET1=[123]和SET2=[abc]就实现了完全对应。
[root@xuexitmp]#
NONameSubjectIDMark备注
1longshuai00156不及格
2gaoxiaofang00160及格
3zhangsan00150不及格
4lisi00180及格
5wangwu00190及格
[root@xuexitmp]#|tr"fang""jin"#结果中n和g都被替换为了n
NONimeSubjectIDMirk备注
1lonnshuii00156不及格
2nioxiiojinn00160及格
3zhinnsin00150不及格
4lisi00180及格
5winnwu00190及格
[root@xuexitmp]#|tr-t"fang""jin"#g被截断,只对应替换fan为jin
NONimeSubjectIDMirk备注
1longshuii00156不及格
2gioxiiojing00160及格
3zhingsin00150不及格
4lisi00180及格
5wingwu00190及格
1.4压缩符号
这功能太爽了。
tr-s[SET1][SET2]
如果不指定SET2,则仅只压缩,不做替换。SET1可以指定多个字符,这样会对每个字符都进⾏压缩,例如tr-s"0a",即会压缩连续的0,也会压缩连续的a。
如果指定了SET2,则压缩后还⼀⼀对应地进⾏替换。
假如⽂件中的内容如下,空格有的地⽅多,有的地⽅少,也就是说这是⼀个没有格式的⽂件。
[root@xuexitmp]#
NONameSubjectIDMark备注
1longshuai00156不及格
2gaoxiaofang00160及格
3zhangsan00150不及格
4lisi00180及格
5wangwu00190及格
使⽤tr压缩空格使其变的规则。
[root@xuexitmp]#|tr-s""
NONameSubjectIDMark备注
1longshuai00156不及格
2gaoxiaofang00160及格
3zhangsan00150不及格
4lisi00180及格
5wangwu00190及格
如果指定SET2,假如替换为"-"。
[root@xuexitmp]#|tr-s"""-"
NO-Name-SubjectID-Mark-备注
1-longshuai-001-56-不及格
2-gaoxiaofang-001-60-及格
3-zhangsan-001-50-不及格
4-lisi-001-80-及格
5-wangwu-001-90-及格
1.5删除符号和补集
tr-d是删除指定的符号,只能接⼀个SET1。
[root@xuexitmp]#|tr-d""
NONameSubjectIDMark备注
1longshuai00156不及格
2gaoxiaofang00160及格
3zhangsan00150不及格
4lisi00180及格
5wangwu00190及格
tr-cSET1SET2是将标准输⼊按照SET1求补集,并将补集部分的字符全部替换为SET2,即将不在标准输⼊中存在但SET1中不存在的字符替换为SET2的字
符。但是SET2如果指定的字符⼤于1个,则只取最后⼀个字符作为替换字符。使⽤-c的时候应该把-cSET1作为⼀个整体,不要将其分开。
例如:
[root@xuexitmp]#echo"abcdefo"|tr-c"ao""y"
ayyyyyoy[root@xuexitmp]
#标准输⼊"abcdefo"按照SET1="ao"求得的补集为bcdef,将它们替换为y,结果即为ayyyyyo,但是结果的最后⾯多了⼀个y并且紧接着命令提⽰符。这是因为
abcdefo尾部的n也是ao的补集的⼀部分,并将其替换为y了。如果不想替换最后的n,可以在SET1中指定n。
[root@xuexitmp]#echo"abcdefo"|tr-c"aon""y"
ayyyyyo
如果SET2指定多个字符,将只取最后⼀个字符作为替换字符。
[root@xuexitmp]#echo"abcdefo"|tr-c"aon""ay"
ayyyyyo
[root@xuexitmp]#echo"abcdefo"|tr-c"aon""yb"
abbbbbo
"-c"常和"-d"⼀起使⽤,如tr-d-cSET1。它先执⾏"-cSET1"求出SET1的补集,再对这个补集执⾏删除。也就是说,最终的结果是完全匹配SET1中的字符。注
意,"-d"⼀定是放在"-c"前⾯的,否则被解析为tr-cSET1SET2,执⾏的就不是删除补集,⽽是替换补集为"-d"的最后⼀个字符d了。
[root@xuexitmp]#echo"one1two2three3"|tr-d-c"[0-9]n"#对数字和分⾏符求补集,并删除这些补集符号
123
[root@xuexitmp]#echo"one1two2three3"|tr-d-c"[0-9]n"#再加⼀个空格求补集
123
[root@xuexitmp]#echo"one1two2three3"|tr-c"[0-9]n"-d#-d选项放在-c选项的后⾯是替换⾏为
dddd1ddddd2ddddddd3
[root@xuexitmp]#echo"one1two2three3"|tr-d-c"[a-zA-z]n"#保留字母
onetwothree
[root@xuexitmp]#echo"one1two2three3"|tr-d-c"[a-zA-z]n"#保留字母的同时保留空格
onetwothree
从上⾯补集的实验中可以看到,其实指定的[0-9]和[a-z]是⼀个字符类,最终的结果显⽰的是这个类中的对象。
在tr中可以使⽤以下⼏种字符类。这些类也可以⽤在其他某些命令中。
[:alnum:]所有的数字和字母。
[:alpha:]所有的字母。
[:blank:]所有⽔平空⽩=空格+tab。
[:cntrl:]所有控制字符(⾮打印字符),在ascii表中的⼋进制0-37对应的字符和177的del。
[:digit:]所有数字。
[:graph:]所有打印字符,不包含空格=数字+字母+标点。
[:lower:]所有⼩写字母。
[:print:]所有打印字符,包含空格=数字+字母+标点+空格。
[:punct:]所有标点符号。
[:space:]所有⽔平或垂直空⽩=空格+tab+分⾏符+垂直tab+分页符+回车键。
[:upper:]所有⼤写字母。
[:xdigit:]所有⼗六进制数字。
使⽤⽅法例如下⾯的。例如[:upper:]等价于[A-Z],[:digit:]等价于[0-9]。
[root@xuexitmp]#echo"oneONE1twoTWO2threeTHREE3"|tr-d-c"[:upper:]n"
ONETWOTHREE
[root@xuexitmp]#echo"oneONE1twoTWO2threeTHREE3"|tr-d-c"[:alpha:]n"
oneONEtwoTWOthreeTHREE
[root@xuexitmp]#echo"oneONE1twoTWO2threeTHREE3"|tr-d-c"[:digit:]n"
123
本文发布于:2022-11-24 02:29:21,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/9314.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |