tr

更新时间:2022-11-24 02:29:21 阅读: 评论:0


2022年11月24日发(作者:baisu)

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小时内删除。

标签:tr
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图