Shell笔记——命令:tr

tr,主要用于将从标准输入读取的数据进行结果集映射、字符压缩和字符删除

主要用于删除文件中的控制字符或进行字符转换

之所以说tr是映射而不是替换,是因为两个结果集替换的时候符号位置是一一对应的。如果SET1比SET2短,则SET2多余的部分会被忽略,如果SET1比SET2长,POSIX认为这是不合理的,但也能执行,只不过结果有些意料之外

语法

tr (选项) (参数)

tr -c -d -s -t 

选项

-c或——complerment:取代所有不属于第一字符集的字符-d或——delete:删除所有属于第一字符集的字符-s或--squeeze-repeats:把连续重复的字符以单独一个字符表示-t或--truncate-set1:先删除第一字符集较第二字符集多出的字符

参数

  • 字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集2”;
  • 字符集2:指定要转换成的目标字符集。

        要求字符集为ASCII

tr -[sdtc]

使用时,提供两个字符串,串1:用于查询,串2:用于处理各种转换;串1的字符被映射到串2上,然后转换开始

 

主要用途:1.大小写转换

                 2.去除控制字符

                 3.删除字符

 

命令格式:

tr –c –d –s [“str_from”] [“str_to”] file

-c,用字符串1中字符集的补集替换此字符集,要求字符集为ASCII

-d,删除字符串1中所有输入字符串,tr -d是删除指定的符号,只能接一个SET1。

-s,删除所有重复出现字符序列,只保留一个,即重复字符串压缩为一个

-t:截断SET1,使得SET1的长度和SET2的长度相同


删除符号和补集

tr -d是删除指定的符号,只能接一个SET1。

[root@xuexi tmp]# cat x.txt | tr -d " "
NONameSubjectIDMark备注
1longshuai00156不及格
2gaoxiaofang00160及格
3zhangsan00150不及格
4lisi00180及格
5wangwu00190及格

tr -c SET1 SET2是将标准输入按照SET1求补集,并将补集部分的字符全部替换为SET2,即将不在标准输入中存在但SET1中不存在的字符替换为SET2的字符。但是SET2如果指定的字符大于1个,则只取最后一个字符作为替换字符。使用-c的时候应该把-c SET1作为一个整体,不要将其分开。

例如:

[root@xuexi tmp]# echo "abcdefo"| tr -c "ao" "y"
ayyyyyoy[root@xuexi tmp]# 

标准输入"abcdefo"按照SET1="ao"求得的补集为bcdef,将它们替换为y,结果即为ayyyyyo,但是结果的最后面多了一个y并且紧接着命令提示符。这是因为abcdefo尾部的\n也是ao的补集的一部分,并将其替换为y了。如果不想替换最后的\n,可以在SET1中指定\n。

[root@xuexi tmp]# echo "abcdefo"| tr -c "ao\n" "y" 
ayyyyyo

如果SET2指定多个字符,将只取最后一个字符作为替换字符。

[root@xuexi tmp]# echo "abcdefo"| tr -c "ao\n" "ay"
ayyyyyo
[root@xuexi tmp]# echo "abcdefo"| tr -c "ao\n" "yb"
abbbbbo

"-c"常和"-d"一起使用,如tr -d -c SET1。它先执行"-c SET1"求出SET1的补集,再对这个补集执行删除。也就是说,最终的结果是完全匹配SET1中的字符。注意,"-d"一定是放在"-c"前面的,否则被解析为tr -c SET1 SET2,执行的就不是删除补集,而是替换补集为"-d"的最后一个字符d了。

[root@xuexi tmp]# echo "one 1 two 2 three 3"| tr -d -c "[0-9]\n"     # 对数字和分行符求补集,并删除这些补集符号
123
[root@xuexi tmp]# echo "one 1 two 2 three 3"| tr -d -c "[0-9] \n"     # 再加一个空格求补集
 1  2  3
[root@xuexi tmp]# echo "one 1 two 2 three 3"| tr -c "[0-9]\n" -d      #  -d选项放在-c选项的后面是替换行为
dddd1ddddd2ddddddd3
[root@xuexi tmp]# echo "one 1 two 2 three 3"| tr -d -c "[a-zA-z]\n"   # 保留字母
onetwothree
[root@xuexi tmp]# echo "one 1 two 2 three 3"| tr -d -c "[a-zA-z] \n"  # 保留字母的同时保留空格


字符范围——tr,可以指定字符串列表或范围作为形成字符串的模式,似正则,但不是正则。

[a-z] [A-Z] [0-9]    /octal一个三位八进制数,对应有效ASCII字符

[s*n]字符s出现n次

 

tr 中特定字符的不同表达方式

/a

Ctrl-g铃声

/007

/b

Ctrl-h退格

/010

/f

Ctrl-l走纸模式

/014

/n

Ctrl-J新行

/012

/r

Ctrl-M回车

/015

/t

Ctrl-I tab键

/011

/v

Ctrl-x

/030

在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]。

 

 

1.       去除所有重复字符【只保留一个】

$tr –s “[a-z]” < oops.txt

2.       去除空行

$tr –s “[/012]” <oops.txt

$tr –s “[/n]” <oops.txt

3.       小写转大写

$echo “AbcdefG” | tr “[a-z]” “[A-Z]”

$echo “AbcdefG” | tr “[:lower:]” “[:upper:]”

4.       删除指定字符串

$tr –cs “[a-z][A-Z]” “[/012*]” < data.txt

将非字母字符转为新行  -s压缩重复的字符

5.       转换控制字符

$tr –s “[/136]” “[/011*]” < start.txt

6.       快速转换

$tr –s “[/r]” “[/n]” < input.txt

7.       匹配多于一个字符

$tr “[0*4]” “*”< input.txt

    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值