西北风的专栏

做一个有价值的程序猿

linux shell编程指南第十章------sed 用法介绍2

显示文件中的控制字符:

当从其他系统下载文件时,有时要删除整个文件的控制字符(非打印字符),从菜单中捕
获一个应用的屏幕输出有时也会将控制字符输出进文件,怎样知道文件中是否有控制字符?
使用cat -v filename命令,屏幕会乱叫,且到处都是一些垃圾字符,这可以确知文件中包含有
控制字符,如果有兴趣可以观察一下这些字符以便于更加确认它们是控制字符。
一些系统中使用cat filename而不是c a t - v来查看非打印字符。
s e d格式为:
[ a d d r e s s,[ a d d r e s s ] ] l
‘l’意为列表。
一般情况下要列出整个文件,而不是模式匹配行,因此使用l要从第一到最后一行。模式
范围1,$即为此意。


前面已经讲述了s e d的基本功能,但是在脚本或命令行中使用s e d真正要做的是修改或删除

文件或字符串中文本。下面运用前面学过的知识讲述这一点。

使用s e d实现的一个重要功能是在另一个系统中下载的文件中剔除控制字符。
下面是传送过来的文件( d o s . t x t)的部分脚本。必须去除所有可疑字符,以便于帐号所有
者使用文件。

任务1。删除所有的#字符很容易,可以使用全局替换命令。这里用一个空格替换两个或
更多的#符号。

[root@localhost huangcd]# cat dos.txt 
12332##DISO##45.12
00332##LPSO##23.11
01299##USPD##34.46
[root@localhost huangcd]# sed 's/##*//g' dos.txt
12332DISO45.12
00332LPSO23.11
01299USPD34.46

任务2。删除所有行首的0。使用^符号表示模式从行首开始, ^ 0 *表示行首任意个0。模式
s / ^ 0 * / / g设置替换部分为空,即为删除模式,正是要求所在。

[root@localhost huangcd]# sed 's/^0*//g' dos.txt 
12332##DISO##45.12
332##LPSO##23.11
1299##USPD##34.46

分步测试预想功能对理解整个过程很有帮助。用s e d在移到下一步前测试本步功能及结果
很重要。如果不这样,可能会有一大堆包含怪异字符的意料外的结果。
将所有命令结合在一起,使用管道将c a t命令结果传入一系列s e d命令, s e d命令与上面几
步精确过滤字符的s e d相同。

[root@localhost huangcd]# cat dos.txt |sed 's/^0*//g' |sed 's/##*//g'
12332DISO45.12
332LPSO23.11
1299USPD34.46

处理报文输出:

当从数据库中执行语句输出时,一旦有了输出结果,脚本即可做进一步处理。通常先做
一些整理,下面是一个s q l查询结果。

为了使用上述输出信息做进一步自动处理,需要知道所存数据库名称,为此需执行以下
操作:
1) 使用s / - * / / g删除横线- - - - - -。
2) 使用/ ^ $ / d删除空行。
3) 使用$ d删除最后一行
4) 使用1 d删除第一行。
5) 使用awk {print $1}打印第一列。
命令如下,这里使用了c a t,并管道传送结果到s e d命令。

[root@localhost huangcd]# cat sql.txt 
Database      Size(MB)    Date Created


-------------------------------------
GOSOUTH       2244        12/11/97
TRISUD        5632        8/9/99


(2 row affected)
[root@localhost huangcd]# cat sql.txt|sed 's/-*//g'|sed '/^$/d'|sed '$d'|sed '1d'|awk '{print $1}'
GOSOUTH
TRISUD

去除行首数字:

对接下来卸载的这个文件实施的操作是去除行首所有数字,每个记录应以U N H或U N D开
头,而不是U N H或U N D前面的数字。文件如下:

[root@localhost huangcd]# cat UNH.txt 
12345UND SPLLFC 234344
99999999UND SKKLT  3423
1UND SPLLY   434

使用基本正则表达式完成这个操作。[ 0 - 9 ]代表行首任意数字,替换部分为空格是为了确
保删除前面的匹配模式,即数字。

[root@localhost huangcd]# sed 's/^[0-9]*//g' UNH.txt 
UND SPLLFC 234344
UND SKKLT  3423
UND SPLLY   434

附加文本:

当帐户完成设置一个文件时,帐号管理者可能要在文件中每个帐号后面加一段文字,下
面是此类文件的一部分:

任务是在每一行末尾加一个字符串‘ p a s s e d’。
使用$命令修改各域会使工作相对容易些。首先需要匹配至少两个或更多的数字重复出现,
这样将所有的帐号加进匹配模式。

[root@localhost huangcd]# cat ok.txt 
AC456
AC492169
AC9967
AC88345
[root@localhost huangcd]# sed 's/[0-9][0-9]*/& passed/g' ok.txt 
AC456 passed
AC492169 passed
AC9967 passed
AC88345 passed


要从命令行中向s e d传值,值得注意的是用双引号,否则功能不执行。

[root@localhost huangcd]# NAME="It's a go situation"
[root@localhost huangcd]# REPLACE="GO"

[root@localhost huangcd]# echo $NAME|sed "s/go/$REPLACE/g"
It's a GO situation



将当前工作目录返回给s e d,删除第一个\:

[root@localhost huangcd]# echo $PWD|sed 's/^\///g'
home/huangcd
[root@localhost huangcd]# echo $PWD
/home/huangcd

将"Mr Wi l l i s "字串返回给s e d并在M r后而追加" B r u c e "。

[root@localhost huangcd]# echo "Mr Willis" | sed 's/Mr/& Bruce/g'
Mr Bruce Willis

s e d删除字符串“a c c o u n t s . d o c”首字符。

[root@localhost huangcd]# echo "accounts.doc" |sed 's/^.//g'
ccounts.doc

s e d删除“a c c o u n t s . d o c”文件扩展名。

[root@localhost huangcd]# echo "accounts.doc"|sed 's/.doc//g'
accounts

s e d附加字符串“. d o c”到字符串“a c c o u n t s”

[root@localhost huangcd]# echo "accounts"|sed 's/$/.doc/g'
accounts.doc


阅读更多
个人分类: linux shell
想对作者说点什么? 我来说一句

LINUX与UNIX SHELL编程指南

2011年03月05日 18.65MB 下载

linux与unix shell编程指南.pdf

2010年10月26日 19.85MB 下载

shell编程指南全集

2009年11月12日 17.5MB 下载

linux shell编程指南

2011年05月22日 19.59MB 下载

linux shell 编程指南

2009年10月06日 953KB 下载

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

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭