SED是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
SED的命令执行流程
sed会从数据中一条一条的读取命令,逐条处理和输出,直到数据的最后一行。
模式空间:sed软件内部的一个临时缓存,用于存放读取到的内容。
SED命令和功能
- 命令格式
sed [options] [command] [inputfile(s)]
sed [options] -f scriptfile
文中统一实验文件
[root@CentOS7 ~]$cat test
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
- 选项
-n:不输出模式空间内容到屏幕,即不自动打印
-e: 多点编辑
-f: /PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
-r: 支持使用扩展正则表达式
-i.bak: 备份文件并原处编辑
-h或–help:显示帮助
-V或–version:显示版本信息
- sed命令
a\ -在当前行下面插入文本。
i\ -在当前行上面插入文本。
d -删除,删除选择的行。
D -删除模板块的第一行。
s -替换指定字符
h -拷贝模板块的内容到内存中的缓冲区。
H -追加模板块的内容到内存中的缓冲区。
g - 获得内存缓冲区的内容,并替代当前模板块中的文本。
G -获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l -列表不能打印字符的清单。
n -读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N -追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p -打印模板块的行。 P(大写) 打印模板块的第一行。
q -退出Sed。
! -表示后面的命令对所有没有被选定的行发生作用。
= -打印当前行号码。 # 把注释扩展到下一个换行符以前。
查找替换
s///:查找替换,支持使用其它分隔符, s@@@, s###替换标记:
g: 行内全局替换
p: 显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中
地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
#:指定的行
/pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步进
1~2 奇数行
2~2 偶数行
实例演示
1、输出原数据并打印第二行
[root@CentOS7 ~]$sed '2p' test
aaa,bbb,ccc
ddd,eee,fff
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
2、只打印数据第二行
[root@CentOS7 ~]$sed -n '2p' test
ddd,eee,fff
3、打印1到4行
[root@CentOS7 ~]$sed -n '1,4p' test
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll
4、只打印含有“ggg”的行
[root@CentOS7 ~]$sed -n '/ggg/p' test
ggg,hhh,iii
5、打印从第二行到含有”ggg”的行
[root@CentOS7 ~]$sed -n '2,/ggg/p' test
ddd,eee,fff
ggg,hhh,iii
6、显示空行行号
[root@CentOS7 ~]$sed -n '/^$/=' test
6
7、打印空行和空行行号
sed -n -e '/^$/p' -e '/^$/=' test
6
8、在含有“ggg”的行后加入“test”
[root@CentOS7 ~]$sed '/ggg/a\test' test
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
test
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
9、在含有“ggg”行前加上“test”
[root@CentOS7 ~]$sed '/ggg/i\test' test
aaa,bbb,ccc
ddd,eee,fff
test
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
10、将含有“ggg”的行替换成“test”
[root@CentOS7 ~]$sed '/ggg/c\test' test
aaa,bbb,ccc
ddd,eee,fff
test
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
11、删除空行
[root@CentOS7 ~]$sed '/^$/d' test
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
12、将文件中前3行删除
[root@CentOS7 ~]$sed '1,3d' test
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
13、使用管道删除2到4行
[root@CentOS7 ~]$nl test | sed '2,4d'
1 aaa,bbb,ccc
5 mmm,nnn,ooo
6 ppp,qqq,rrr
14、将文件中的“ggg”替换成“XXX”
[root@CentOS7 ~]$sed 's/g/X/g' test
aaa,bbb,ccc
ddd,eee,fff
XXX,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
[root@CentOS7 ~]$sed 's/ggg/XXX/' test
aaa,bbb,ccc
ddd,eee,fff
XXX,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
15、在“ggg”单词前加入“XXX”
[root@CentOS7 ~]$sed -n 's/ggg/XXX&/p' test
XXXggg,hhh,iii
16、在“ggg”单词后面加入“XXX”
[root@CentOS7 ~]$sed -n 's/ggg/&XXX/p' test
gggXXX,hhh,iii
17、将“ggg”替换成“XXX”,并将“ooo”替换成“YYY”
[root@CentOS7 ~]$sed -e 's/g/X/g' -e 's/ooo/YYY/' test
aaa,bbb,ccc
ddd,eee,fff
XXX,hhh,iii
jjj,kkk,lll
mmm,nnn,YYY
ppp,qqq,rrr
18、将“ggg”替换成“XXX”并备份一份.bak文件
[root@CentOS7 ~]$sed -i.bak 's/ggg/xxx/' test
[root@CentOS7 ~]$cat test.bak
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
[root@CentOS7 ~]$cat test
aaa,bbb,ccc
ddd,eee,fff
xxx,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
19、打印奇数行
[root@CentOS7 ~]$cat test | sed -n '1~2p'
aaa,bbb,ccc
ggg,hhh,iii
mmm,nnn,ooo
ppp,qqq,rrr
20、打印偶数行
[root@CentOS7 ~]$cat test | sed -n '2~2p'
ddd,eee,fff
jjj,kkk,lll
[root@CentOS7 ~]$sed -n 'n;p' test
ddd,eee,fff
jjj,kkk,lll
21、倒叙显示文件内容
[root@CentOS7 ~]$sed '1!G;h;$!d' test
ppp,qqq,rrr
mmm,nnn,ooo
jjj,kkk,lll
ggg,hhh,iii
ddd,eee,fff
aaa,bbb,ccc
[root@CentOS7 ~]$sed -n '1!G;h;$p' test
ppp,qqq,rrr
mmm,nnn,ooo
jjj,kkk,lll
ggg,hhh,iii
ddd,eee,fff
aaa,bbb,ccc
22、显示文件的最后一行
[root@CentOS7 ~]$sed 'N;D' test
ppp,qqq,rrr
[root@CentOS7 ~]$sed '$!d' test
ppp,qqq,rrr
23、显示文件的最后两行
[root@CentOS7 ~]$sed '$!N;$!D' test
ppp,qqq,rrr
24、每行后面加入空行
[root@CentOS7 ~]$sed 'G' test
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
25、将文件所有内容改成空行
[root@CentOS7 ~]$sed 'g' test
26、将文件中空行删除,之后在每行后面插入空行
[root@CentOS7 ~]$sed '/^$/d;G' test
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
27、删除文件中的偶数行
[root@CentOS7 ~]$sed 'n;d' test
aaa,bbb,ccc
ggg,hhh,iii
mmm,nnn,ooo
ppp,qqq,rrr