Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1365512
  • 博文数量: 632
  • 博客积分: 2778
  • 博客等级: 大尉
  • 技术积分: 3387
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 09:09
个人简介

123

文章分类

全部博文(632)

文章存档

2014年(36)

2013年(33)

2012年(563)

分类: LINUX

2012-12-12 10:45:02

转自:http://blog.chinaunix.net/uid-20687081-id-1571148.html

sed是一个非交互性文本流编辑器,必须通过行号或正则表达式指定要改变的文本行。它编辑文件或标准输入导出的文本拷贝。标准输入可能是来自键盘、文件重定向、字符串或变量,或者是一个管道的文本。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                             表示行号范围从x到y,如2,5表示从第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 !                          查询不包含指定行号x和y的行。1 , 2 !
 
 
sed和正则表达式
s e d识别任何基本正则表达式和模式及其行匹配规则。记住规则之一是:如果要定位一特殊字符,必须使用( \)屏蔽其特殊含义
 
使用p(rint)显示行
#nl passwd | sed '35p'              /*显示了所有文件中的所有行*/
必须使用-n选项与p参数一起打印定位行
#nl passwd | sed -n '35p'          /*只显示了35行*/
 
打印范围
可以指定行的范围,用逗号分隔行号
仅显示第5~8行:
#nl passwd | sed -n '5,8p'
同时显示不连续的多行数据
#nl passwd | sed -n '1,3p; 34,37p'            /*列出1到3行及34到37行的数据*/
打印指定不包含的行
#nl -b a passwd | sed -n '40,45!p'             /*不打印40到45行数据*/
 
打印模式
要匹配单词”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参数来读取外部文件数据到匹配关健字的下一行
Ex:cdn.txt 内容为:
# sed '/cdnunion/ r cdn.txt' passwd                 /*some.txt内容就会附加到passwd的拷贝中*/
 
修改文本(替换文本)
修改命令将在匹配模式空间的指定行用新文本加以替代
Ex :将第2~5行替换为””
#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                  /*打印1到3行的数据写入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           /*直接在行尾添加*/
 
删除文本
地址可以是行的范围或模式
删除第2~5行
#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' /*对匹配root和cdnunion的行进行删除*/
 
匹配后退出
当匹配到第一个字符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键

阅读(626) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~