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

原创 2013年12月02日 23:49:10

关于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与UNIX Shell编程指南

本文来自于哥们对《LINUX与UNIX Shell编程指南》一书的写写画画,并合成了自己当初一些疑问点所致,仅限学习使用,同时向原作者致敬。 原书请见 http://product.chin...
  • bravezhe
  • bravezhe
  • 2013年10月31日 13:16
  • 3734

linux shell tr命令及sed命令使用

tr命令详解,转自 http://fyan.iteye.com/blog/1172279 sed命令详解,转自:http://blog.sina.com.cn/s/blog_a56ef5490101c...
  • yangyan19870319
  • yangyan19870319
  • 2014年04月03日 12:31
  • 2083

[Shell]tr命令详解

1. 用途tr,translate的简写,主要用于压缩重复字符,删除文件中的控制字符以及进行字符转换操作。2. 语法tr [OPTION]... SET1 [SET2]3. 参数3.1 -s 压缩重复...
  • SunnyYoona
  • SunnyYoona
  • 2016年10月31日 21:19
  • 1869

shell中tr的用法

tr(translate缩写)主要用于删除文件中的控制字符,或进行字符转换。 语法:tr [–c/d/s/t] [SET1] [SET2] SET1: 字符集1 SET2:字符集2 -c:comple...
  • u014421422
  • u014421422
  • 2015年01月17日 14:04
  • 261

Shell笔记——命令:tr

tr,用来从标准输入中通过替换/删除进行字符转换主要用于删除文件中的控制字符或进行字符转换 使用时,提供两个字符串,串1:用于查询,串2:用于处理各种转换;串1的字符被映射到串2上,然后转换开始 主要...
  • wklken
  • wklken
  • 2011年06月20日 11:03
  • 4050

《Linux与unix Shell编程指南》 总结

《Linux与unix Shell编程指南》 总结 标签: linux网络dstcron服务器 2011-01-10 18:27 3742人阅读 评论(0) 收藏 举报...
  • yu132563
  • yu132563
  • 2016年06月02日 10:54
  • 327

Linux下tr的用法

1.关于tr 通过使用 tr,您可以非常容易地实现 sed 的许多最基本功能。您可以将 tr 看作为 sed 的(极其)简化的变体:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符。您也可...
  • ajaxuser
  • ajaxuser
  • 2010年09月28日 09:13
  • 2394

Shell学习:字符转换、删除及压缩工具 tr命令

r命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。 tr命令格式 tr [选项] 字符集1 字符集2 # 字符集1 ...
  • chunlovenan
  • chunlovenan
  • 2014年04月08日 21:10
  • 1112

[SHELL]:tr 命令详解

通过使用 tr,您可以非常容易地实现 sed 的许多最基本功能。您可以将 tr 看作为 sed 的(极其)简化的变体:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符。您也可以用它来除去重复...
  • happygongzhuo
  • happygongzhuo
  • 2011年09月23日 23:59
  • 1883

shell去掉空白行、多余空格

去掉空白行: tr -s ["\012"] newtest.txt sed -n '/./p' temp_file5 > newtest.txt grep . temp_file5...
  • imzoer
  • imzoer
  • 2012年04月30日 15:42
  • 25768
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux shell编程指南第十二章------------tr 用法
举报原因:
原因补充:

(最多只允许输入30个字)