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键