分类:
2009-09-21 11:03:29
tr 用来从标准输入中通过替换或删除操作进行字符转换.tr主要用于删除文件中控制字符或进行字符转换.使用tr时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换.tr刚执行时,字符串1中的字符被映射到字符串2中的字符,然后转换操作开始.
一般格式:tr -c -d -s ["string1_to_translate_from"] ["string2_to_triampsulata_te_to"]
-c:用字符串1中字符集的补集替换此字符,要求字符集为ASCII
-d:删除字符串1中所有输入字符
-s:删除所有重复出现字符序列,只保留一个,即将重复出现字符串压缩为一个字符串
12.1 字符范围:
[a-z]:a-z内的字符组成的字符串
[A-Z]:A-Z内的字符组成的字符串
[0-9]:数字串
/octal:一个三位的八进制数,对应有效的ASCII字符
[O*n]:表示字符O重复出现指定次数n,例[O*2]表示匹配[OO]字符串
12.2 保存输出
要保存输出结果,需将之重定向到一个文件.例:重定向输出到文件results.txt,输入文件是cops.txt:
$tr -s "[a-z]"
12.3 去除重复出现的字符
$more cops.txt
And the cowwwwws went homeeeeeeee
Or did theyyyy
如果要去除重复字符或将其压缩在一起,可以使用-s选项,因为都是字母,故使用[a-z]:
$tr -s "[a-z]"
Or did they
12.4 删除空行
可使用-s来作这项工作.换行的八进制表示位\012,例:
$more plane.txt
and 0500 399999 2773888
or 093999 3766666
data 39
and 0500 399999 2773888 12.5 大小写转换 除了删除控制字符,转换大小写是tr最常用的功能.为此需指定即将转换的小写字符[a-z]和转换结果[A-Z] 例1:tr从一个包含大小写字母的字符串中接受输入: $echo "May Day,May Day,Going Down..."|tr "[a-z]" "[A-Z]" MAY DAY,MAY DAY,GOING DOWN... $echo "MAY DAY,MAY DAY,GOING DOWN..."|tr "[A-Z]" "[a-z]" 或者也可以使用字符类[:upper:]和[:lower:] 12.7 删除指定字符 偶尔会从下载文件中删除之包含字母或数字的列.需要结合使用-c和-s选项来完成此功能. $more diary.txt monday 10:50 $tr -cs "[a-z][A-Z]" "[\012*]" monday 12.8 转换控制字符 tr的第一个功能就是转换控制字符,特别是从dos向UNIX下载文件时,忘记设置FTP关于回车换行转换的选项时更是如此. 下面是估计没有设置转换开关的一个文本文件,使用cat -v 显示控制字符. $cat stat.tr 猜想,'^^^^^^'是tab键,每一行以ctrl-M结尾,文件结尾ctrl-z,以下是改动方法: 使用-s选项,查看ASCII表,^的八进制代码是136,^M是015,tab键是011,^Z是032,下面按步骤完成最终功能. 用tab键替换^^^^^^,命令"\136""[\011*]",并输出到stat.tmp: $tr -s "[\136]" "[\011*]" < stat.tr > stat.tmp 用新行替换每行末尾的^M,并用\n去除^Z,输入文件来自stat.tmp: $tr -s "[\015\032]" "\n" < stat.tmp 如果要删除文件中^M,并代之以换行: 要删除所有的tab键,代之以空格: 例:替换/etc/passwd文件中所有冒号,代之以tab键,可以增加可读性: $tr -s "[:]" "[\011]" < /etc/passwd 或: $tr "[:]" "[\t]" < /etc/passwd 12.10 匹配多于一个字符 可以使用[character*n]格式匹配多于一个字符.例: 1293 hdisk3 替换第三行的0为星号: 或替换成百分号:
$tr -s "[\012]"
or 093999 3766666
data 39
同样也可以使用字符类[:lower:]和[:upper:]
$echo "May Day,May Day,Going Down..."|tr "[:lower:]" "[:upper:]"
MAY DAY,MAY DAY,GOING DOWN...
may day,may day,going down...
$echo "MAY DAY,MAY DAY,GONING DOWN..."|tr "[:upper:]" "[:lower:]"
may day,may day,going down...
下面的文件包含一个星期的日程表.任务是从其中删 除所有数字,之保留日期.日期有大写,也有小写格式.因此需指定两个字符范围[a-z]和[A-Z],命令tr -cs "[a-z][A-Z]""[\012*]"将文件每行所有不包含在[a-z]或[A-Z]的字符串放在字符串1中并转换为一新行.-s选项表明压缩所有 新行,-c表明保留所有字母不动:
Tuesday 15:30
wednesday 15:30
thurday 10:30
Friday 09:20
Tuesday
wednesday
thurday
Friday
Boxes paper^^^^^^12^M
Clips metal^^^^^^50^M
Penciles-meduim^^^^^^10^M
^Z
Boxes paper 12^M
Clips metal 50^M
Pencils-medium 10^M
^Z
12.9 快速转换
$tr -s "[\015]" "\n" < input_file
或者:
$tr -s "[\r]" "[\n]" < input_file
或者:
$tr -s "\r" "\n" < input_file
$tr -s "[\011]" "[\040*]" < intput_file
原文件:
$cat hdisk.txt
4512 hdisk12
0000 hdisk5
4993 hdisk12
2994 hdisk7
$tr "[0*4]" "*" < hdisk.txt
1293 hdisk3
4512 hdisk12
**** hdisk5
4993 hdisk12
2994 hdisk7
$tr "[0*4]" "%"
4512 hdisk12
%%%% hdisk5
4993 hdisk12
2994 hdisk7