西北风的专栏

做一个有价值的程序猿

linux shell编程指南第十二章------------tr 用法

关于tr:

t r用来从标准输入中通过替换或删除操作进行字符转换。t r主要用于删除文件中控制字符

或进行字符转换。使用t r时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换。
t r刚执行时,字符串1中的字符被映射到字符串2中的字符,然后转换操作开始。
本章内容有:
• 大小写转换。
• 去除控制字符。
• 删除空行。
带有最常用选项的t r命令格式为:
t r - c - d - s [ " s t r i n g 1 _ t o _ t r a n s l a t e _ f r o m " ] [ " s t r i n g 2 _ t o _ t riannpsulta_t e _ t o " ]      I n p u t - f i l e
这里:
-c 用字符串1中字符集的补集替换此字符集,要求字符集为A S C I I。
-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符
串。

I n p u t - f i l e是转换文件名。虽然可以使用其他格式输入,但这种格式最常用。

字符范围

使用t r时,可以指定字符串列表或范围作为形成字符串的模式。这看起来很像正则表达式,
但实际上不是。指定字符串1或字符串2的内容时,只能使用单字符或字符串范围或列表。
[a-z] a-z内的字符组成的字符串。
[A-Z] A-Z内的字符组成的字符串。
[0-9] 数字串。
/octal 一个三位的八进制数,对应有效的A S C I I字符。
[O*n] 表示字符O重复出现指定次数n。因此[ O * 2 ]匹配O O的字符串。
大部分t r变种支持字符类和速记控制字符。字符类格式为[:c l a s s ],包含数字、希腊字母、
空行、小写、大写、c n t r l键、空格、点记符、图形等等。表1 2 - 1包括最常用的控制字符的速
记方式及三位八进制引用方式。
当用一个单字符替换一个字符串或字符范围时,注意字符并不放在方括号里( [ ])。一些
系统也可以使用方括号,例如可以写成[“\ 0 1 2”]或“\ 0 1 2”,t r也允许不加引号,因此命令中
看到单引号而不是双引号时也不要感到奇怪。
像大多数系统工具一样, t r也受特定字符的影响。因此如果要匹配这些字符,需使用反斜

线屏蔽其特殊含义。例如,用\ {指定花括号左边可以屏蔽其特殊含义。
表12-1 tr中特定控制字符的不同表达方式

要保存输出结果,需将之重定向到一个文件。下面的例子重定向输出到文件r e s u l t s . t x t。
输入文件是c o p s . t x t。

[root@localhost huangcd]# cat opps.txt 
And the cowwwwws went homeeeeeee
Or did theyyy
[root@localhost huangcd]# tr -s "[a-z]"<opps.txt >results.txt
[root@localhost huangcd]# cat results.txt 
And the cows went home
Or did they

如果要去除重复字母或将其压缩在一起,使用- s选项。因为都是字母,故使用[ a - z ]。输入
文件重定向到t r命令。

[root@localhost huangcd]# cat opps.txt 
And the cowwwwws went homeeeeeee
Or did theyyy
[root@localhost huangcd]# tr -s "[a-z]"<opps.txt 
And the cows went home
Or did they

所有重复字符被压缩成一个。如果使用c a t命令,再将结果管道输出至t r,结果是一样的。

[root@localhost huangcd]# cat opps.txt |tr -s "[a-z]"
And the cows went home
Or did they

要删除空行,可将之剔出文件。下面是一个文件p l a n e . t x t。文本间有许多空行。

使用- s来做这项工作。换行的八进制表示为\ 0 1 2,命令为:

[root@localhost huangcd]# cat plane.txt 
983784  Spitfire




190992  Lancaster


238991  Typhoon
[root@localhost huangcd]# tr -s "[\012]" < plane.txt      //删除重复的换行符
983784  Spitfire
190992  Lancaster
238991  Typhoon

[root@localhost huangcd]# tr -s ["\n"] <plane.txt 
983784  Spitfire
190992  Lancaster
238991  Typhoon

大写到小写:

除了删除控制字符,转换大小写是t r最常用的功能。为此需指定即将转换的小写字符[ a - z ]
和转换结果[ A - Z ]。
第一个例子,t r从一个包含大小写字母的字符串中接受输入。

[root@localhost huangcd]# echo "May Day,May Day,Going Down...."|tr "[a-z]" "[A-Z]"
MAY DAY,MAY DAY,GOING DOWN....

同样,也可以使用字符类[:l o w e r:]和[:u p p e r:]
[root@localhost huangcd]# echo "May Day,May Day,Going Down...."|tr "[:lower:]" "[:upper:]"
MAY DAY,MAY DAY,GOING DOWN....

将文本文件大写转换为小写并输出至一个新文件,格式为:

[root@localhost huangcd]# echo "Look for the route,or make"|tr "[a-z]" "[A-Z]">new-file-name
[root@localhost huangcd]# cat new-file-name 
LOOK FOR THE ROUTE,OR MAKE

转换小写到大写与上一节大写到小写过程刚好相反。以下有两个例子:

[root@localhost huangcd]# echo "hello huangchengdu nihao"|tr "[a-z]" "[A-Z]"
HELLO HUANGCHENGDU NIHAO

偶尔会从下载文件中删除只包含字母或数字的列。需要结合使用- c和- s选项完成此功能。
下面的文件包含一个星期的日程表。任务是从其中删除所有数字,只保留日期。日期有大
写,也有小写格式。因此需指定两个字符范围[ a - z ]和[ A - Z ],命令tr -cs "[a-z][A-Z]""[\012*]"将

文件每行所有不包含在[ a - z ]或[ A - Z ](所有希腊字母)的字符串放在字符串1中并转换为一新
行。- s选项表明压缩所有新行, - c表明保留所有字母不动。原文件如下,后跟t r命令:

[root@localhost huangcd]# tr -c "[a-z][A-Z]"  "[\n*]"<diary.txt 
monday






Tuesday






wednesday

[root@localhost huangcd]# tr -cs "[a-z][A-Z]"  "[\n*]"<diary.txt 
monday
Tuesday
wednesday
thursday
Friday

转换控制字符:

t r的第一个功能就是转换控制字符,特别是从d o s向U N I X下载文件时,忘记设置f t p关于回
车换行转换的选项时更是如此。
下面是故意没有设置转换开关的一个文本文件,是关于文具需求的一部分内容。使用c a t
- v显示控制字符。

[root@localhost huangcd]# cat -v stat.tr 
Boxes paper^^^^^^12^M
Clips metal^^^^^^50^M
Pencils-meduim^^^^^^10^M

猜想‘^ ^ ^ ^ ^ ^’是t a b键。每一行以C t r l - M结尾,文件结尾C t r l - Z,以下是改动方法。
使用- s选项,查看A S C I I表。^的八进制代码是1 3 6,^ M是0 1 5,t a b键是0 11,^ Z是0 3 2 ,下
面将按步骤完成最终功能。
用t a b键替换^ ^ ^ ^ ^ ^,命令为" \ 1 3 6 " " [ \ 0 11 * ] "。将结果重定向到临时工作文件s t a t . t m p。

[root@localhost huangcd]# tr -s "[\136]" "[\011*]" <stat.tr >stat.tmp
[root@localhost huangcd]# cat stat.tmp
Boxes paper     12      M
Clips metal     50      M
Pencils-meduim  10      M


[root@localhost huangcd]# tr -s "[\136]" "[\011]" <stat.tr >stat.tmp
[root@localhost huangcd]# cat stat.tmp
Boxes paper     12      M
Clips metal     50      M
Pencils-meduim  10      M

用新行替换每行末尾的^ M,并用\ n去除^ Z,输入要来自于临时工作文件s t a t . t m p。

[root@localhost huangcd]# tr -s "[\015\032]" "\n" <stat.tmp
Boxes paper     12      M
Clips metal     50      M
Pencils-meduim  10      M

最后去除所有的控制字符,文件就可以使用了。

[root@localhost huangcd]# cat -v stat.tmp
Boxes paper     12      M
Clips metal     50      M
Pencils-meduim  10      M

快速转换:

如果需要删除文件中^ M,并代之以换行。使用命令:

[root@localhost huangcd]# tr -s "[\015]" "[\n]"<stat.tr>stat.tmp
[root@localhost huangcd]# cat -v stat.tmp
Boxes paper^^^^^^12^M
Clips metal^^^^^^50^M
Pencils-meduim^^^^^^10^M
[root@localhost huangcd]# cat -v stat.tr
Boxes paper^^^^^^12^M
Clips metal^^^^^^50^M
Pencils-meduim^^^^^^10^M

或者用下述命令得同样结果。

tr -s "[\r]" "[\n]"<stat.tr

也可以用下述命令:

tr -s "\r" "\n"<stat.tr

另一个一般的D o s到U N I X转换是命令:将删除所有^ M和^ Z,代之以换行。

[root@localhost huangcd]# tr -s "[\015\032]" "[\012*]" <stat.tr
Boxes paper^^^^^^12^M
Clips metal^^^^^^50^M
Pencils-meduim^^^^^^10^M

要删除所有的t a b键,代之以空格,使用命令:

[root@localhost huangcd]# tr -s "[\011]" "[\040*]" <stat.tr
Boxes paper^^^^^^12^M
Clips metal^^^^^^50^M
Pencils-meduim^^^^^^10^M

替换p a s s w d文件中所有冒号,代之以t a b键,可以增加可读性。将冒号引起来,指定替换
字符串中t a b键八进制值0 11,下面是p a s s w d文件,后跟t r命令结果:

[root@localhost huangcd]# cat /etc/passwd|head -5
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost huangcd]# tr -s "[:]" "[\011]"</etc/passwd|head -5
root    x       0       0       root    /root   /bin/bash
bin     x       1       1       bin     /bin    /sbin/nologin
daemon  x       2       2       daemon  /sbin   /sbin/nologin
adm     x       3       4       adm     /var/adm        /sbin/nologin
lp      x       4       7       lp      /var/spool/lpd  /sbin/nologin

匹配多于一个字符:

可以使用[ c h a r a c t e r * n ]格式匹配多于一个字符。下述文件列出系统硬盘信息,其中包含了
系统已经注册的和未识别的。第一列是数字,如果不全是0,表明第二列相应硬盘已经注册。
有时全部为0看起来很烦人,找个吸引人注意力的符号来代替它,以便一眼就能看出哪个
硬盘已注册,哪个不可识别。原文件如下:

[root@localhost huangcd]# cat hdisk.txt 
1293 hdisk3
1243 hdisk44
1253 hdisk23
0000 hdisk123
1693 hdisk13

从文件列表中知道,有一个硬盘未注册,因此用星号代替所有的0。模式为[ 0 * 4 ],意即匹
配至少4个0,替换字符串为星号,过滤命令及结果如下:

[root@localhost huangcd]# tr "[0*4]" "*" <hdisk.txt
1293 hdisk3
1243 hdisk44
1253 hdisk23
**** hdisk123
1693 hdisk13


阅读更多
个人分类: linux shell
上一篇linux shell编程指南第十一章------------合并与分割2
下一篇linux shell编程指南第十章------sed 用法介绍2
想对作者说点什么? 我来说一句

shell编程指南全集

2009年11月12日 17.5MB 下载

linux shell编程指南

2011年05月22日 19.59MB 下载

LINUX与UNIX Shell编程指南

2011年04月01日 4MB 下载

LINUX与UNIX SHELL编程指南

2009年10月09日 17.04MB 下载

LINUX与UNIX SHELL编程指南.part1

2011年05月17日 9.54MB 下载

Linux与UNIX的Shell编程指南

2010年06月04日 17.03MB 下载

没有更多推荐了,返回首页

关闭
关闭