[TOC]
一、什么是sed,以及sed是如何工作的?
1、sed是一个流编辑器,它可以对从标准输入流中得到数据进行处理,然后把处理以后得到的结果输出到标准输出,而标准输出通常关联到终端屏幕,因此处理后的结果也会显示到屏幕上。
2、sed的工作模式,当sed命令执行时,它会从输入文件中(或者标准输入)读取一行数据,并把这行数据复制一份保存在它内部的一个工作缓存中。sed命令把它的这个缓存叫做模式空间,所有的数据都是在这个缓存处理的。然后sed命令会根据指定的编辑命令对缓存中的数据精心处理。当这行数据处理完以后,sed会读取下一行数据,重复整个过程,直到所有的数据被处理完为止。当有多个编辑命令时,会将上一个编辑命令处理完的结果作为下一个编辑命令的输入,重复数据处理过程,并且严格按照顺序执行,先执行完前面的,再执行后面的,所以需要注意顺序,避免得不到预期的结果。
二、sed的语法
1、基本语法
|
|
2、选项
-n:仅列出编辑命令处理的行,一般和p动作合用
|
|
-e:同时实现多个命令,每个编辑命令前加-e,可用于脚本
|
|
-r:使用特殊符号时,不用使用转义符,与grep的-E选项作用一致
-i:直接读取修改文件的内容,在i后面加上.bak可以在修改之前将原文件备份为filename.bak
-f:指定编辑命令脚本文件
3、如何选择操作的行
(1)在sed编辑命令前指定操作的行
#sed ‘3d’ file \\选择第三行
#sed ‘3,8d’ file \\表示指定行的范围,起始行需要小于终止行(不能缺少)
#sed -n ‘3,+3p’ file \\表示打印第三行以及后面三行
#sed -n ‘1~2p’ file \\起始行为第1行,“~”表示每隔1行取一行打印。
(2)使用正则表达式确定操作的行
#sed ‘/^$/d’ file
#sed -n ‘/pattern1/,/pattern2/‘p file \\打印文件中从正则1到正则2的行
(3)匹配字符串
#sed -n ‘/字符串1/p’ file \\打印文件中包含字符串1的行
4、编辑命令动作
(1)p:打印,一般与选项-n一起使用
可打印,’行数’ ‘/字符串/‘ ‘/正则表达式/‘
|
|
如何不打印匹配到的内容,在p前面加一个!即可
(2)d:删除
可删除,’行数’ ‘/字符串/‘ ‘/正则表达式/‘
|
|
(3)i,在匹配到的行上方插入内容
可匹配,’行数’ ‘/字符串/‘ ‘/正则表达式/‘
|
|
(4)a,在匹配到的行下方增加内容
可匹配, ‘行数’ ‘/字符串/‘ ‘/正则表达式/‘
|
|
(5)I:匹配字符串时不区分大小写,需要写在p前面
|
|
(6)s,替换匹配到的字符
可匹配, ‘/字符串/’ ‘/表达式/’
语法:s/被替换字符/替换字符/gi 被替换字符=A 替换字符=B
多行替换:n,ns/A/B/g n,$s/A/B/g %s/A/B/g
/可以使用#,@替代,g表示全局替换,i表示不区分大小写。
5、编辑命令中“s”动作的使用
(1)基本语法
sed ‘/正则1/s/正则2/正则3/gi’ file
说明:匹配到正则1的行,将正则2匹配到的内容修改为正则3的内容。
①其中的“/”可以使用“#”OR“@”替换
②正则1可以省略,表示全局替换。也可以使用行号代替。\#sed ‘1,3s/A/B/gi’
③正则2表示准备替换的内容,正则3表示替换内容。
④g表示整行替换,i表示不区分大小写
(2)如何引用匹配到的内容
使用符号“&”可以替代正则2匹配到的结果
#sed ‘’s/正则2/&字符串/gi \\在正则2匹配到的内容后面添加内容
#sed ‘’s/正则2/字符串&/gi \\将正则2匹配到的内容前面添加内容
|
|
(3)替换字符位置
替换字符位置需要根据文件的特征,使用相应的正则表达式表示需要替换的字符串。并用()表示成一个整体,方便后面引用,使用\1,\2进行引用,最多9个。
#sed -r ‘s/(rot)(.*)(bash)/\3\2\1/‘ passwd
|
|
sed -r ‘1s/([^:]+):(.*):([^:]+)/\3:\2:\1/g’ passwd
|
|
(4)()与\1,&的应用:
①将()表示的内容替换为整行
|
|
②&与\1一起使用后,使用bash执行输出内容
|
|
一些复杂的操作,可以使用sed显示出来,然后使用|bash直接执行。
三、sed的拓展使用
1、sed修改文件时先备份文件
在-i选项后边加上.bak(.任意字符),sed会对文件进行先备份后修改
|
|
2、sed如何获取行号
|
|
匹配行数,字符串,正则表达式,指定显示行号
显示总行数的方法:sed -n '$=' filename
3、sed如何取不连续的行
|
|
4、特殊符号{}的使用
|
|