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

来源:互联网 发布:电梯优化问题 编辑:程序博客网 时间:2024/06/07 04:59

显示文件中的控制字符:

当从其他系统下载文件时,有时要删除整个文件的控制字符(非打印字符),从菜单中捕
获一个应用的屏幕输出有时也会将控制字符输出进文件,怎样知道文件中是否有控制字符?
使用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


原创粉丝点击