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

原创 2013年12月03日 00:37:30

显示文件中的控制字符:

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

要附加文本,使用符号a \,可以将指定文本一行或多行附加到指定行。如果不指定文本放 置位置, s e d缺省放在每一行后面。附加文本时不能指定范围,只允许一个地址模式。文本附 加操作时,结果输出在标准...

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

s e d是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。标准输入可 能是来自键盘、文件重定向、字符串或变量,或者是一个管道的文本。s e d可以做些什么呢? 别忘了,Vi也是一个文本...

linux shell编程指南第七章------正则表达式介绍

本章设计的基本元字符使用在g r e p和s e d命令中,同时结合{ \ \ }(以字符出现情况进行匹配的元字符)使用在a w k语言中。 行首前4个字符为c o m p,匹配操作表示为: ...

linux shell编程指南第九章------AWK 介绍1

为使一域号匹配正则表达式,使用符号‘~’后紧跟正则表达式,也可以用i f语句。a w k 中i f后面的条件用()括起来。 观察文件g r a d e . t x t,如果只要打印b r o w n腰...

linux shell编程指南第九章------AWK 介绍

如果要格式化报文或从一个大的文本文件中抽取数据包,那么a w k可以完成这些任务。它 在文本浏览和数据的熟练使用上性能优异。 可以说a w k是一种自解释的编程语言,之所以要在s h e l l中使用...

linux shell编程指南第十六章------shell脚本介绍

一个s h e l l脚本可以包含一个或多个命令。当然可以不必只为了两个命令就编写一个s h e l l 脚本,一切由用户自己决定。 s h e l l脚本可以在行命令中接收信息,并使用它作为另一个命...

linux shell编程指南第二十章------向脚本传递参数

前面已经讲到如何使用特定变量$ 1 . . $ 9向脚本传递参数。$ #用于统计传递参数的个数。可 以创建一个u s a g e语句,需要时可通知用户怎样以适当的调用参数调用脚本或函数。 简单地说...

linux shell编程指南第十八章------控制流结构1

前面讨论e x p r时指出,循环时如果要加入计数,使用此命令。下面使用l s在f o r循环中列出 文件及其数目。 [root@localhost huangcd]# cat forcount  ...

linux shell编程指南第三章------后台执行命令

。为了使这些进程能够在后台运行,也就是说不在终端屏幕上 运行,有几种选择方法可供使用。 在本章中我们将讨论: • 设置c r o n t a b文件,并用它来提交作业。 • 使用a t命令来提交作业。...

linux shell编程指南第八章------grep 家族

相信g r e p是U N I X和L I N U X中使用最广泛的命令之一。g r e p(全局正则表达式版本)允许 对文本文件进行模式查找。如果找到匹配模式, g r e p打印包含模式的所有行。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux shell编程指南第十章------sed 用法介绍2
举报原因:
原因补充:

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