linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > article > Linux开发区 > SHELL >
栏目导栏
资料搜索
热门文章
·csh shell编程入门
·玩转Linux shell命令提示符
·Bourne Shell及shell编程
·Shell 编程实例集锦
·Linux下的shell编程入门
·Shell编程基础
·linux shell 编程基础
·shell基础十二篇
·Linux的Shell编程
·linux Shell编程入门 实例讲解
·Linux主要shell命令详解
·Linux shell 脚本实例一
·深入浅出Shell编程: Shell 变量
·shell命令(一)
·UNIX/LINUX SHELL 正则表达式语
最新文章
·Linux系统中加入自定义Shell为
·Shell学习:关于替换命令-tr-R
·Linux Shell学习:uniq命令使用
·uClinux操作系统下的shell功能
·Shell编程基础:单引号和双引号
·Linux操作系统下Shell语句元字
·Linux系统环境程序设计之路
·Linux Shell中PS命令中的%CPU的
·Linux Shell元字符知识笔记
·压缩命令-vi-认识SHELL-正规表
·Linux系统下Shell命令行快捷键
·谈Linux Shell下的输出重定向
·在Shell中执行vi/cp/mv时自动备
·shell数组介绍
·开启和关闭Shell特性的小技巧
Google
 
shell基础十二篇
[ 作者:  加入时间:2006-06-28 22:06:04  来自: ]
编者按:由 [color=orange]wingger[/color]  整理的 [color=green]shell基础十二篇[/color] 涉及shell 编程及使用的各个方面,又附有大量的例子,极适合初学者系统学习。如果配合網中人的[color=green]shell 十三問? [/color],效果更加明显。 eY8Linux联盟
eY8Linux联盟
这里是其中的第十章 sed.  其他各章可察看相应的 link.  [/size] eY8Linux联盟
eY8Linux联盟
shell基础1:文件安全与权限  eY8Linux联盟
http://bbs.chinaunix.net/forum/viewtopic.php?t=434579&highlight=wingger eY8Linux联盟
eY8Linux联盟
附:Linux的用户和用户组管理  eY8Linux联盟
http://bbs.chinaunix.net/forum/viewtopic.php?t=438660&highlight=wingger eY8Linux联盟
eY8Linux联盟
shell基础二:查找技巧,find及xargs的使用 eY8Linux联盟
http://bbs.chinaunix.net/forum/viewtopic.php?t=441883&highlight=wingger eY8Linux联盟
  eY8Linux联盟
shell基础三和四:后台(crontab,at,&,nohup)及(*,?,[]等)  eY8Linux联盟
http://bbs.chinaunix.net/forum/viewtopic.php?t=442596&highlight=wingger eY8Linux联盟
eY8Linux联盟
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)  eY8Linux联盟
http://bbs.chinaunix.net/forum/viewtopic.php?t=444209&highlight=wingger eY8Linux联盟
eY8Linux联盟
shell基础六七:命令执行顺序(||及&&,{}及())和正则表?  eY8Linux联盟
http://bbs.chinaunix.net/forum/viewtopic.php?t=445229&highlight=wingger eY8Linux联盟
eY8Linux联盟
shell基础八:文本过滤工具(grep)  eY8Linux联盟
http://bbs.chinaunix.net/forum/viewtopic.php?t=446683&highlight=wingger eY8Linux联盟
eY8Linux联盟
http://bbs.chinaunix.net/forum/viewtopic.php?t=448687&highlight=wingger eY8Linux联盟
shell基础九:awk  eY8Linux联盟
eY8Linux联盟
http://bbs.chinaunix.net/forum/viewtopic.php?t=452942&highlight=wingger eY8Linux联盟
shell基础十:sed  eY8Linux联盟
eY8Linux联盟
http://bbs.chinaunix.net/forum/viewtopic.php?t=457730&highlight=wingger eY8Linux联盟
基础11:文件分类、合并和分割(sort,uniq,join,cut,paste,split)  eY8Linux联盟
  eY8Linux联盟
shell基础十二:tr  eY8Linux联盟
http://bbs.chinaunix.net/forum/viewtopic.php?t=459099&highlight=wingger eY8Linux联盟
eY8Linux联盟
eY8Linux联盟
其它我的笔记都在我的BLOG上,呵呵,有兴趣的可以去看看 eY8Linux联盟
eY8Linux联盟
[size=4]shell基础十:sed[/size] eY8Linux联盟
eY8Linux联盟
eY8Linux联盟
sed 用法介绍 eY8Linux联盟
eY8Linux联盟
s e d是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。 eY8Linux联盟
eY8Linux联盟
引用:" 抽取域。 eY8Linux联盟
" 匹配正则表达式。 eY8Linux联盟
" 比较域。 eY8Linux联盟
" 增加、附加、替换。 eY8Linux联盟
" 基本的s e d命令和一行脚本。
eY8Linux联盟
eY8Linux联盟
eY8Linux联盟
可以在命令行输入s e d命令,也可以在一个文件中写入命令,然后调用s e d,这与a w k基本相同。使用s e d需要记住的一个重要事实是,无论命令是什么, s e d并不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。 eY8Linux联盟
eY8Linux联盟
因为s e d是一个非交互性编辑器,必须通过行号或正则表达式指定要改变的文本行。 eY8Linux联盟
本文介绍s e d用法和功能。本章大多编写的是一行命令和小脚本。这样做可以慢慢加深对s e d用法的了解,取得宝贵的经验,以便最终自己编出大的复杂s e d脚本。 eY8Linux联盟
和g r e p与a w k一样, s e d是一种重要的文本过滤工具,或者使用一行命令或者使用管道与g r e p与a w k相结合。 eY8Linux联盟
eY8Linux联盟
1 sed怎样读取数据 eY8Linux联盟
eY8Linux联盟
s e d从文件的一个文本行或从标准输入的几种格式中读取数据,将之拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条命令,并使用这些命令查找模式或定位行号编辑它。重复此过程直到命令结束。 eY8Linux联盟
eY8Linux联盟
2 调用sed eY8Linux联盟
eY8Linux联盟
调用s e d有三种方式:在命令行键入命令;将s e d命令插入脚本文件,然后调用s e d;将s e d命令插入脚本文件,并使s e d脚本可执行。 eY8Linux联盟
eY8Linux联盟
使用s e d命令行格式为: eY8Linux联盟
sed [选项] s e d命令输入文件。
eY8Linux联盟
记住在命令行使用s e d命令时,实际命令要加单引号。s e d也允许加双引号。 eY8Linux联盟
eY8Linux联盟
使用s e d脚本文件,格式为: eY8Linux联盟
sed [选项] -f sed脚本文件输入文件
eY8Linux联盟
eY8Linux联盟
要使用第一行具有s e d命令解释器的s e d脚本文件,其格式为: eY8Linux联盟
s e d脚本文件[选项] 输入文件
eY8Linux联盟
eY8Linux联盟
不管是使用s h e l l命令行方式或脚本文件方式,如果没有指定输入文件, s e d从标准输入中接受输入,一般是键盘或重定向结果。 eY8Linux联盟
eY8Linux联盟
引用:s e d选项如下: eY8Linux联盟
n 不打印;s e d不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑)。p命令可以用来打印编辑行。 eY8Linux联盟
c 下一命令是编辑命令。使用多项编辑时加入此选项。如果只用到一条s e d命令,此选项无用,但指定它也没有关系。 eY8Linux联盟
f 如果正在调用s e d脚本文件,使用此选项。此选项通知s e d一个脚本文件支持所有的s e d命令,例如:sed -f myscript.sed input_file,这里m y s c r i p t . s e d即为支持s e d命令的文件。
eY8Linux联盟
eY8Linux联盟
eY8Linux联盟
2.1 保存sed输出 eY8Linux联盟
由于不接触初始化文件,如果想要保存改动内容,简单地将所有输出重定向到一个文件即可。下面的例子重定向s e d命令的所有输出至文件‘ m y o u t f i l e’,当对结果很满意时使用这种方法。 eY8Linux联盟
$sed 'some-sed-commands' input-file > myoutfile
eY8Linux联盟
eY8Linux联盟
2.2 使用sed在文件中查询文本的方式 eY8Linux联盟
s e d浏览输入文件时,缺省从第一行开始,有两种方式定位文本: eY8Linux联盟
引用:1) 使用行号,可以是一个简单数字,或是一个行号范围。 eY8Linux联盟
2 ) 使用正则表达式
eY8Linux联盟
eY8Linux联盟
eY8Linux联盟
下面是使用s e d定位文本的一些方式。 eY8Linux联盟
eY8Linux联盟
x x为一行号,如1
eY8Linux联盟
x , y 表示行号范围从x到y,如2,5表示从第2行到第5行 eY8Linux联盟
/ p a t t e r n / 查询包含模式的行。例如/ d i s k /或/[a-z]/ eY8Linux联盟
/ p a t t e r n / p a t t e r n / 查询包含两个模式的行。例如/ d i s k / d i s k s / eY8Linux联盟
p a t t e r n / , x 在给定行号上查询包含模式的行。如/ r i b b o n / , 3 eY8Linux联盟
x , / p a t t e r n / 通过行号和模式查询匹配行。3 . / v d u / eY8Linux联盟
x , y ! 查询不包含指定行号x和y的行。1 , 2 !
eY8Linux联盟
eY8Linux联盟
2.3 基本sed编辑命令 eY8Linux联盟
eY8Linux联盟
sed编辑命令
eY8Linux联盟
p 打印匹配行 eY8Linux联盟
= 显示文件行号 eY8Linux联盟
a  在定位行号后附加新文本信息 eY8Linux联盟
i  在定位行号后插入新文本信息 eY8Linux联盟
d 删除定位行 eY8Linux联盟
c  用新文本替换定位文本 eY8Linux联盟
s 使用替换模式替换相应模式 eY8Linux联盟
r 从另一个文件中读文本 eY8Linux联盟
w 写文本到一个文件 eY8Linux联盟
q 第一个模式匹配完成后推出或立即推出 eY8Linux联盟
l 显示与八进制A S C I I代码等价的控制字符 eY8Linux联盟
{ } 在定位行执行的命令组 eY8Linux联盟
n 从另一个文件中读文本下一行,并附加在下一行 eY8Linux联盟
g 将模式2粘贴到/pattern n/ eY8Linux联盟
y 传送字符 eY8Linux联盟
n 延续到下一输入行;允许跨行的模式匹配语句
eY8Linux联盟
eY8Linux联盟
eY8Linux联盟
sed和正则表达式 eY8Linux联盟
eY8Linux联盟
s e d识别任何基本正则表达式和模式及其行匹配规则。记住规则之一是:如果要定位一特殊字符,必须使用( )屏蔽其特殊含义eY8Linux联盟
s e d例子中使用下述文本文件q u o t e . t x t。 eY8Linux联盟
[sam@Linux_chenwy sam]$ cat quote.txt
eY8Linux联盟
The honeysuckle band played all night long for only $90. eY8Linux联盟
It was an evening of splendid music and company. eY8Linux联盟
Too bad the disco floor fell through at 23:00. eY8Linux联盟
The local nurse Miss P.Neave was in attendance.
eY8Linux联盟
eY8Linux联盟
1 使用p(rint)显示行 eY8Linux联盟
只打印第二行,用-n eY8Linux联盟
[sam@Linux_chenwy sam]$ sed -n '2p' quote.txt
eY8Linux联盟
It was an evening of splendid music and company.
eY8Linux联盟
eY8Linux联盟
2 打印范围 eY8Linux联盟
可以指定行的范围,现打印1到3行,用逗号分隔行号。 eY8Linux联盟
[sam@Linux_chenwy sam]$ sed -n '1,3p' quote.txt
eY8Linux联盟
The honeysuckle band played all night long for only $90. eY8Linux联盟
It was an evening of splendid music and company. eY8Linux联盟
Too bad the disco floor fell through at 23:00.
eY8Linux联盟
eY8Linux联盟
3 打印模式 eY8Linux联盟
假定要匹配单词N e a v e,并打印此行,方法如下。使用模式/ p a t t e r n /格式,这里为/ N e a v e /。 eY8Linux联盟
[sam@Linux_chenwy sam]$ sed -n '/The/p' quote.txt
eY8Linux联盟
The honeysuckle band played all night long for only $90. eY8Linux联盟
The local nurse Miss P.Neave was in attendance.
eY8Linux联盟
eY8Linux联盟
4 使用模式和行号进行查询 eY8Linux联盟
可以将行号和模式结合使用。假定要改动文件q u o t e . t x t最后一行中的单词t h e,使用s e d查询t h e,返回两行: eY8Linux联盟
[sam@Linux_chenwy sam]$ sed -n '/The/p' quote.txt
eY8Linux联盟
The honeysuckle band played all night long for only $90. eY8Linux联盟
The local nurse Miss P.Neave was in attendance.
eY8Linux联盟
eY8Linux联盟
使用模式与行号的混合方式可以剔除第一行,格式为l i n e _ n u m b e r, / p a t t e r n /。逗号用来分隔行号与模式开始部分。为达到预期结果,使用4 , / t h e /。意即只在第四行查询模式t h e,命令如下: eY8Linux联盟
[sam@Linux_chenwy sam]$ sed -n '4,/The/p' quote.txt
eY8Linux联盟
The local nurse Miss P.Neave was in attendance.
eY8Linux联盟
上面有错,其实是把第四行后的都打出来了 eY8Linux联盟
这个模式应该哪果指定行找不到符合条件的,就从下一行开始查找,直到找到为止,并把,找到行之前的全部打打印出来。 eY8Linux联盟
如果指定行本身就符合条伯,把本行及后面的行的全部打印出来 eY8Linux联盟
eY8Linux联盟
eY8Linux联盟
5 匹配元字符 eY8Linux联盟
匹配元字符$前,必须使用反斜线屏蔽其特殊含义。模式为/$/ p。 eY8Linux联盟
[sam@Linux_chenwy sam]$ sed -n '/$/p' quote.txt
eY8Linux联盟
The honeysuckle band played all night long for only $90.
eY8Linux联盟
eY8Linux联盟
6 显示整个文件 eY8Linux联盟
要打印整个文件,只需将行范围设为第一行到最后一行1 , $。$意为最后一行。 eY8Linux联盟
[sam@Linux_chenwy sam]$ sed -n '1,$p' quote.txt
eY8Linux联盟
The honeysuckle band played all night long for only $90. eY8Linux联盟
It was an evening of splendid music and company. eY8Linux联盟
Too bad the disco floor fell through at 23:00. eY8Linux联盟
The local nurse Miss P.Neave was in attendance.
eY8Linux联盟
eY8Linux联盟
7 任意字符 eY8Linux联盟
匹配任意字母,后跟任意字母的0次或多次重复,并以i n g结尾,模式为/ . * i n g /。可以使用这个模式查询以i n g结尾的任意单词。 eY8Linux联盟
[sam@Linux_chenwy sam]$ sed -n '/.*ing/p' quote.txt
eY8Linux联盟
It was an evening of splendid music and company.
eY8Linux联盟
eY8Linux联盟
8 首行 eY8Linux联盟
要打印文件第一行,使用行号: eY8Linux联盟
[sam@Linux_chenwy sam]$ sed -n '1p' quote.txt
eY8Linux联盟
The honeysuckle band played all night long for only $90.
eY8Linux联盟
eY8Linux联盟
9 最后一行 eY8Linux联盟
要打印最后一行,使用$。$是代表最后一行的元字符。 eY8Linux联盟
[sam@Linux_chenwy sam]$ sed -n '$p' quote.txt
eY8Linux联盟
The local nurse Miss P.Neave was in attendance.
eY8Linux联盟
eY8Linux联盟
10 打印行号 eY8Linux联盟
要打印行号,使用等号=。打印模式匹配的行号,使用格式/ p a t t e r n / =。 eY8Linux联盟
[sam@Linux_chenwy sam]$ sed -e '/music/=' quote.txt
eY8Linux联盟
The honeysuckle band played all night long for only $90. eY8Linux联盟
2 eY8Linux联盟
It was an evening of splendid music and company. eY8Linux联盟
Too bad the disco floor fell through at 23:00. eY8Linux联盟
The local nurse Miss P.Neave was in attendance.
eY8Linux联盟
eY8Linux联盟
整个文件都打印出来,并且匹配行打印了行号。如果只关心实际行号,使用- e选项。 eY8Linux联盟
[sam@Linux_chenwy sam]$ sed -n '/music/=' quote.txt
eY8Linux联盟
2
eY8Linux联盟
eY8Linux联盟
如果只打印行号及匹配行,必须使用两个s e d命令,并使用e选项。第一个命令打印模式匹配行,第二个使用=选项打印行号,格式为sed -n -e /pattern/p -e /pattern/= eY8Linux联盟
[sam@Linux_chenwy sam]$ sed -n -e '/music/p' -e '/music/='  quote.txt
eY8Linux联盟
It was an evening of splendid music and company. eY8Linux联盟
2
eY8Linux联盟
11 附加文本 eY8Linux联盟
eY8Linux联盟
要附加文本,使用符号a ,可以将指定文本一行或多行附加到指定行。如果不指定文本放置位置, s e d缺省放在每一行后面。附加文本时不能指定范围,只允许一个地址模式。文本附加操作时,结果输出在标准输出上。注意它不能被编辑,因为s e d执行时,首先将文件的一行文本拷贝至缓冲区,在这里s e d编辑命令执行所有操作(不是在初始文件上),因为文本直接输出到标准输出,s e d并无拷贝。 eY8Linux联盟
要想在附加操作后编辑文本,必须保存文件,然后运行另一个s e d命令编辑它。这时文件的内容又被移至缓冲区。 eY8Linux联盟
附加操作格式如下: eY8Linux联盟
[address]a
eY8Linux联盟
text eY8Linux联盟
text eY8Linux联盟
...... eY8Linux联盟
text

eY8Linux联盟
eY8Linux联盟
地址指定一个模式或行号,定位新文本附加位置。a 通知s e d对a 后的文本进行实际附加操作。观察格式,注意每一行后面有一斜划线,这个斜划线代表换行。s e d执行到这儿,将创建一新行,然后插入下一文本行。最后一行不加斜划线, s e d假定这是附加命令结尾。 eY8Linux联盟
eY8Linux联盟
当附加或插入文本或键入几个s e d命令时,可以利用辅助的s h e l l提示符以输入多行命令。当附加或插入文本或键入几个s e d命令时,可以利用辅助的s h e l l提示符以输入多行命令。eY8Linux联盟

创建sed脚本文件 eY8Linux联盟
eY8Linux联盟
创建脚本文件a p p e n d . s e d: eY8Linux联盟
第一行是s e d命令解释行。脚本在这一行查找s e d以运行命令,这里定位在/ b i n。 eY8Linux联盟
第二行以/ c o m p a n y /开始,这是附加操作起始位置。a 通知s e d这是一个附加操作,首先应插入一个新行。 eY8Linux联盟
第三行是附加操作要加入到拷贝的实际文本。 eY8Linux联盟
输出显示附加结果。如果要保存输出,重定向到一个文件。 eY8Linux联盟

[sam@chenwy sam]$ cat append.sed
eY8Linux联盟
#!/bin/sed -f eY8Linux联盟
/company/ a eY8Linux联盟
Then suddenly it happed.

eY8Linux联盟
保存它,增加可执行权限,运行 eY8Linux联盟
eY8Linux联盟

[sam@chenwy sam]chmod u+x append.sed
eY8Linux联盟
[sam@chenwy sam]$ ./append.sed quote.txt eY8Linux联盟
The honeysuckle band played all night long for only $90. eY8Linux联盟
It was an evening of splendid music and company. eY8Linux联盟
Then suddenly it happed. eY8Linux联盟
Too bad the disco floor fell through at 23:00. eY8Linux联盟
The local nurse Miss P.Neave was in attendance.

eY8Linux联盟
eY8Linux联盟
或直接用命令行: eY8Linux联盟

[sam@chenwy sam]$ sed "/company/aThen suddenly it happened." quote.txt
eY8Linux联盟
The honeysuckle band played all night long for only $90. eY8Linux联盟
It was an evening of splendid music and company. eY8Linux联盟
Then suddenly it happened. eY8Linux联盟
Too bad the disco floor fell through at 23:00. eY8Linux联盟
The local nurse Miss P.Neave was in attendance.

eY8Linux联盟
eY8Linux联盟
eY8Linux联盟
[sam@chenwy sam]$ sed "/company/iutter confusion followed." quote.txt eY8Linux联盟
The honeysuckle band played all night long for only $90. eY8Linux联盟
utter confusion followed. eY8Linux联盟
It was an evening of splendid music and company. eY8Linux联盟
Too bad the disco floor fell through at 23:00. eY8Linux联盟
The local nurse Miss P.Neave was in attendance. eY8Linux联盟
eY8Linux联盟
插入文本: eY8Linux联盟
插入命令类似于附加命令,只是在指定行前面插入。和附加命令一样,它也只接受一个地址。 eY8Linux联盟
如在a t t e n d a n c e结尾的行前插入文本utter confusion followed。 eY8Linux联盟

[sam@chenwy sam]$ sed "/company/iUtter confusion followed." quote.txt

eY8Linux联盟
eY8Linux联盟
也可以指定行: eY8Linux联盟

[sam@chenwy sam]$ cat insert.sed
eY8Linux联盟
#!/bin/sed -f eY8Linux联盟
4 i eY8Linux联盟
Utter confusion followed.

eY8Linux联盟
eY8Linux联盟
执行结果 eY8Linux联盟

[sam@chenwy sam]$ chmod u+x insert.sed
eY8Linux联盟
[sam@chenwy sam]$ ./insert.sed quote.txt eY8Linux联盟
The honeysuckle band played all night long for only $90. eY8Linux联盟
It was an evening of splendid music and company. eY8Linux联盟
Too bad the disco floor fell through at 23:00. eY8Linux联盟
Utter confusion followed. eY8Linux联盟
The local nurse Miss P.Neave was in attendance.

eY8Linux联盟
eY8Linux联盟
修改文本 eY8Linux联盟
修改命令将在匹配模式空间的指定行用新文本加以替代,格式如下: eY8Linux联盟
将第一行The honeysuckle band played all night long for only $90替换为The office Di b b l e  band played well。首先要匹配第一行的任何部分,可使用模式‘ / H o n e y s u c k l e /’。s e d脚本文件为c h a n g e . s e d。内容如下: eY8Linux联盟

[sam@chenwy sam]$ cat change.sed
eY8Linux联盟
#!/bin/sed -f eY8Linux联盟
3 c eY8Linux联盟
The office Dibble band played well.

eY8Linux联盟
eY8Linux联盟

[sam@chenwy sam]$ chmod u+x change.sed
eY8Linux联盟
[sam@chenwy sam]$ ./change.sed quote.txt eY8Linux联盟
The honeysuckle band played all night long for only $90. eY8Linux联盟
It was an evening of splendid music and company. eY8Linux联盟
The office Dibble band played well. eY8Linux联盟
The local nurse Miss P.Neave was in attendance.

eY8Linux联盟
eY8Linux联盟
或命令行: eY8Linux联盟

[sam@chenwy sam]$ sed "/honeysuck/cThe Office Dibble band played well." quote.txt
eY8Linux联盟
The Office Dibble band played well. Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
分页:[1] 2 3 4 5
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
无相关信息