Chinaunix首页 | 论坛 | 博客
  • 博客访问: 284007
  • 博文数量: 155
  • 博客积分: 1688
  • 博客等级: 上尉
  • 技术积分: 1560
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-17 08:06
文章分类
文章存档

2011年(16)

2009年(137)

2008年(2)

sed

分类: LINUX

2009-08-08 11:08:45

s e d是一个非交互性文本流编辑器,必须通过行号或正则表达式指定要改变的文本行。它编辑文件或标准输入导出的文本拷贝。标准输入可能是来自键盘、文件重定向、字符串或变量,或者是一个管道的文本。s e d并不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕

 

调用sed

命令格式:sed  [-nefr]  [动作]

相关参数:

-n      使用安静模式,在一般sed的用法中,所有来自STDIN的数据一般都会显示在屏幕上,但如果加上-n参数,则只有经过sed特殊处理的那一行才会列出来。

-e      直接在命令行模式上进行sed的操作编辑。

-f       直接将sed的操作写在一个文件内,-f  filename 则可以执行filename内的sed操作。

-r      sed的操作支持的扩展正则表达式的语法(默认是基础正则表达式语法)

 

function有下面这些操作:

=       显示文件行号

a       新增,a的后面可以接字符串,而这些字符串会在新的一行出现(当前的下一行)

c       替换,c的后面可以接字符串,这些字符串可以替换n1,n2之间的行

d       删除,因为是删除,所以d后面经常不接任何内容

i        插入,i的后面可以接字符串,面这些字符串会在新的一行出现(当前的上一行)

p       打印,即打印某个选择的数据。通常p会与参数sed  –n 一起运行

s       搜索,不但可以搜索,还能进行替换。通常s操作可以与正则表达式一起使用。

         如:1,20s/old/new/g

r RFile 读取 RFile 变量的内容,在读取下一输入行之前将内容放置到输出。

w     写文本到一个文件

========================

保存sed输出

#sed -n '36,$p' passwd > sed.out             /*36到最后行的数据保存到文件*/

#sed -n '36,$p' passwd | tee sed.out      /*保存到文件的同时还显示到屏幕上*/

 

使用sed在文件中查询文本的方式

s e d浏览输入文件时,缺省从第一行开始,有两种方式定位文本:

1) 使用行号,可以是一个简单数字,或是一个行号范围。

2) 使用正则表达式

使用s e d在文件中定位文本的方式

x                                  x为一行号,如1

x , y                             表示行号范围从xy,如25表示从第2行到第5

/ p a t t e r n /          查询包含模式的行。例如/ cdnunion //[a-z]/

/ p a t t e r n / p a t t e r n / 查询包含两个模式的行。例如/ cdn / cdnunion /

p a t t e r n / , x        在给定行号上查询包含模式的行。如/ cdnunion/ , 3

x , / p a t t e r n /     通过行号和模式查询匹配行。3 . / cdnunion /

x , y !                          查询不包含指定行号xy的行。1 , 2 !

 

 

sed和正则表达式

s e d识别任何基本正则表达式和模式及其行匹配规则。记住规则之一是:如果要定位一特殊字符,必须使用( \)屏蔽其特殊含义

 

使用print)显示行

#nl passwd | sed '35p'              /*显示了所有文件中的所有行*/

必须使用-n选项与p参数一起打印定位行

#nl passwd | sed -n '35p'          /*只显示了35*/

 

打印范围

可以指定行的范围,用逗号分隔行号

仅显示第58行:

#nl passwd | sed -n '5,8p'

同时显示不连续的多行数据

#nl passwd | sed -n '1,3p; 34,37p'            /*列出13行及3437行的数据*/

打印指定不包含的行

#nl -b a passwd | sed -n '40,45!p'             /*不打印4045行数据*/

 

打印模式

要匹配单词”cdnunion”并打印出来

#sed -n '/cdnunion/'p passwd

#sed -n '/^cdnunion/p' passwd

 

使用模式和行号进行查询

查询匹配的单词可能会有多行

# nl -b a passwd | sed -n '45,/cdnunion/p'       /*只对45行进行模式匹配*/

# nl -b a passwd | sed -n '/cdnunion/,45p'

 

匹配元字符

元字符要转义

#sed -n '/\$/p' passwd

 

显示整个文件

打印从第一到最后行

#sed -n '1,$p' passwd

打印首行和尾行

# nl passwd | sed -n '1p'

# nl passwd | sed -n '$p'

 

 

 

任意字符

打印匹配前边是任务字母,并以”union”结尾的任意单词

# sed -n '/.*union/p' passwd

 

打印行号

对匹配含有”cdnunion”行的行号同时也打印出来

#sed -e '/cdnunion/=' passwd                    /*所有的数据都打印出来了*/

只打印匹配模式的行号

#sed -n '/cdnunion/=' passwd

只打印匹配行的行号

#sed -n '/cdnunion/=' passwd

只打印相匹配的行及行号

# sed -n -e '/cdnunion/p' -e '/cdnunion/=' passwd

 

附加文本

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

在第二行后插入一行内容” cdnunion”文字

#nl passwd | sed -e '2a cdnunion'

还可以在第二行前面插入一行

#nl passwd | sed '2i cdnunion'

同时插入不连续的行,在第二行和第四行分别插入

#nl passwd | sed -e '2a cdnunion' -e '4a cdnunion'

#nl passwd |sed -e '2i cdnunion' -e '5i cdnunion'

在行前或行后插入多行(在第行的后边添加一个换行符\n)

#nl passwd | sed '2a cdnunion or ....\nCDNUNION'

#nl passwd | sed '2i cdnunion or ...\nCDNUNION'

 

插入文本

格式:address  r  filename

使用r参数来读取外部文件数据到匹配关健字的下一行

Excdn.txt 内容为:

# sed '/cdnunion/ r cdn.txt' passwd                 /*some.txt内容就会附加到passwd的拷贝中*/

 

修改文本(替换文本)

修改命令将在匹配模式空间的指定行用新文本加以替代

Ex :将第25行替换为””

#nl passwd | sed '2,5c '

在一个文件中找出相匹配的关健字的行来替换新行

#sed '/cdnunion/c cdn' passwd |nl

同时替换不连续的多行

#nl passwd | sed -e '3c cdnunion' -e '5c cdnunion'

#nl passwd | sed -e '/cdnunion/c cdn' -e '/root/c CDNUNION'

对文件里的关健字进行替换

#sed 's/root/cdnunion/' passwd  | head   只对其中的第一个相匹配的字符做了替换

# sed 's/root/cdnunion/g' passwd  | head  加参数g后是对文件里所有相匹配的都进行替换

对特殊的字符进行替换或删除时要用转义符(\)

#sed 's/\$/$$/g' passwd          

可以对替换后的结果写入另外一个文件中,被写入的文件中只包含修改过的数据

#sed 's/root/cdnunion/w passwd.out' passwd                

#sed 's/root/cdnunion/gw passwd.out' passwd     /*可以多个参数一起运用*/

# sed -n '1,3 w passwd.out' passwd                  /*打印13行的数据写入passwd.out文件*/

使用替换修改字符串

test.ok文本原句是:I’m OK!

OK前加上一个real

# sed -n 's/OK/real &/p' test.ok ;cat test.ok            /* &就是相当时被匹配的OK字符*/

匹配后的:I'm real OK!

去除首行的数字

#sed -n 's/^[0-9]*//gp' cdnunion                        /*去除文件中行首为数字的行*/

# sed -n 's/^0*//gp' cdnunion                              /*去除开头的0*/

对行首或者是行尾添加相同的字符串

#sed -n 's/^/cdnunion &/gp' cdnunion  /*对文件cdnunion中每行行首添加cdnunion字符串*/

# sed -n 's/$/& cdnunion/gp' cdnunion    /*在文件cdnunion中每行行尾添加cdnunion字符串*/

#sed -n 's/^/cdnunion/gp' passwd            /*直接在行首添加*/

# sed -n 's/$/cdnunion/gp' passwd           /*直接在行尾添加*/

 

删除文本

地址可以是行的范围或模式

删除第25

#nl passwd | sed -e '2,5d'

删除第3行到最后一行:

#nl passwd | sed -e '3,$d'

找到相匹配的关健字的行进行删除

#sed '/cdnunion/d' passwd  | nl              /*匹配cdnunion的那行删除*/

对空白行进删除

# cat passwd | sed '/^$/d'                 /*对所有空白行进行删除*/

同时删除不连续的多行

#nl -b a passwd | sed '13d;24d;30d;38d'

同时删除不同匹配对像的多处理删除

#nl passwd | sed -e '/root/d' -e '/cdnunion/d' /*对匹配rootcdnunion的行进行删除*/

 

匹配后退出

当匹配到第一个字符cdnunion时就马上退出

#nl -b a passwd| sed '/cdnunion/q'

 

 

仅列出ifconfig中的IP地址

#ifconfig  | sed -n '2p' | awk '{print $2}' | sed 's/addr://g'

#ifconfig | sed -n '2p'  | sed 's/.*addr://g'|sed 's/Bcast.*//g'

 

[]—空格   [ ]—Tab

s /\.$//g                    删除以句点结尾行

-e /cdnunion/d         删除包含a b c d的行

s /[][][]*/[]/ g            删除一个以上空格,用一个空格代替

s /^[] []*//g               删除行首空格

s /\.[][]*/[]/g            删除句点后跟两个或更多空格,代之以一个空格

/^$/d                           删除空行

s /^.// g                     删除第一个字符

s /cdn\(...\) // g       删除紧跟cdn的后三个字母

s /^\///g                    从路径中删除第一个\

s /[]/[ ]/g                   删除所有空格并用t a b键替代

S /^[ ]//g                    删除行首所有t a b

s /[ ]*//g                    删除所有t a b

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

上一篇:awk

下一篇:ubuntu的启动级别

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