Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1039567
  • 博文数量: 243
  • 博客积分: 3053
  • 博客等级: 中校
  • 技术积分: 2975
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-02 21:11
文章分类

全部博文(243)

文章存档

2013年(2)

2012年(20)

2011年(5)

2010年(114)

2009年(102)

我的朋友

分类:

2009-09-21 11:03:29

.linux 字符串操作tr(sed补全)

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]"results.txt

12.3 去除重复出现的字符

$more cops.txt

And the cowwwwws went homeeeeeeee
Or did theyyyy
如果要去除重复字符或将其压缩在一起,可以使用-s选项,因为都是字母,故使用[a-z]:
$tr -s "[a-z]"And the cows went home
Or did they

12.4 删除空行

可使用-s来作这项工作.换行的八进制表示位\012,例:
$more plane.txt
and 0500 399999 2773888

or 093999 3766666

data 39


$tr -s "[\012]"

and 0500 399999 2773888
or 093999 3766666
data 39

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...


同样也可以使用字符类[:lower:]和[:upper:]
$echo "May Day,May Day,Going Down..."|tr "[:lower:]" "[:upper:]"
MAY DAY,MAY DAY,GOING DOWN...

$echo "MAY DAY,MAY DAY,GOING DOWN..."|tr "[A-Z]" "[a-z]"
may day,may day,going down...

或者也可以使用字符类[:upper:]和[:lower:]
$echo "MAY DAY,MAY DAY,GONING DOWN..."|tr "[:upper:]" "[:lower:]"
may day,may day,going down...

12.7 删除指定字符

偶尔会从下载文件中删除之包含字母或数字的列.需要结合使用-c和-s选项来完成此功能.
下面的文件包含一个星期的日程表.任务是从其中删 除所有数字,之保留日期.日期有大写,也有小写格式.因此需指定两个字符范围[a-z]和[A-Z],命令tr -cs "[a-z][A-Z]""[\012*]"将文件每行所有不包含在[a-z]或[A-Z]的字符串放在字符串1中并转换为一新行.-s选项表明压缩所有 新行,-c表明保留所有字母不动:

$more diary.txt

monday 10:50
Tuesday 15:30
wednesday 15:30
thurday 10:30
Friday 09:20

$tr -cs "[a-z][A-Z]" "[\012*]"

monday
Tuesday
wednesday
thurday
Friday

12.8 转换控制字符

tr的第一个功能就是转换控制字符,特别是从dos向UNIX下载文件时,忘记设置FTP关于回车换行转换的选项时更是如此.

下面是估计没有设置转换开关的一个文本文件,使用cat -v 显示控制字符.

$cat stat.tr
Boxes paper^^^^^^12^M
Clips metal^^^^^^50^M
Penciles-meduim^^^^^^10^M
^Z

猜想,'^^^^^^'是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
Boxes paper 12^M
Clips metal 50^M
Pencils-medium 10^M
^Z

用新行替换每行末尾的^M,并用\n去除^Z,输入文件来自stat.tmp:

$tr -s "[\015\032]" "\n" < stat.tmp


12.9 快速转换

如果要删除文件中^M,并代之以换行:
$tr -s "[\015]" "\n" < input_file
或者:
$tr -s "[\r]" "[\n]" < input_file
或者:
$tr -s "\r" "\n" < input_file

要删除所有的tab键,代之以空格:
$tr -s "[\011]" "[\040*]" < intput_file

例:替换/etc/passwd文件中所有冒号,代之以tab键,可以增加可读性:

$tr -s "[:]" "[\011]" < /etc/passwd

或:

$tr "[:]" "[\t]" < /etc/passwd

12.10 匹配多于一个字符

可以使用[character*n]格式匹配多于一个字符.例:
原文件:
$cat hdisk.txt

1293 hdisk3
4512 hdisk12
0000 hdisk5
4993 hdisk12
2994 hdisk7

替换第三行的0为星号:
$tr "[0*4]" "*" < hdisk.txt
1293 hdisk3
4512 hdisk12
**** hdisk5
4993 hdisk12
2994 hdisk7

或替换成百分号:
$tr "[0*4]" "%"1293 hdisk3
4512 hdisk12
%%%% hdisk5
4993 hdisk12
2994 hdisk7

阅读(1513) | 评论(0) | 转发(0) |
0

上一篇:Shell的字符串处理

下一篇:Shell的时间编程

给主人留下些什么吧!~~