1.1 功能说明

stream editor  流编辑器,实现对文件的增删改替换查

1.2 语法格式

sed [OPTION]... {script-only-if-no-other-script}[input-file]...

sed –n ‘/过滤内容/’处理的命令 文件

sed –i ‘s#被替换内容#替换内容#g’ 文件

参数

简解

-n

取消默认输出

-i

改变文件内容

-r

不用转义,去掉马甲

-e

允许多项编辑

1.3 实践操作

实例1-1   

问题:打印出oldboy.txt中的oldboy字符串

命令:sed –n ‘/oldboy/’poldboy.txt

代码

[root@ben-test ~]# sed -n '/oldboy/'p oldboy.txt

oldboy

说明:p 表示打印 

 

实例1-2   

问题:打印出ett.txt20—30行的内容

命令:sed –n’20,30’p ett.txt

代码

[root@ben-test ~]# sed -n '20,30'p ett.txt

20

21

22

23

24

25

26

27

28

29

30

说明:此处’20,30’表示2030

 

实例1-3   

问题:把oldboy.txt中的oldboy删除,打印出内容

命令:sed –i ‘/oldboy/’doldboy.txt

代码

[root@ben-test ~]# sed -i '/oldboy/'d oldboy.txt 

[root@ben-test ~]# cat oldboy.txt

test

liyao

说明:d 表示删除输出

     -i 表示改变文件内容,如果不加-i参数,只打印删除后的内容,而没有真正改变文件中的内容

 

实例1-4   

问题:把oldboy.txt中的test替换成oldboy

命令:sed –i‘s#test#oldboy#g’ oldboy.txt

代码

[root@ben-test ~]# cat oldboy.txt

test

liyao

test

[root@ben-test ~]# sed -i 's#test#oldboy#g'oldboy.txt

[root@ben-test ~]# cat oldboy.txt                    

oldboy

liyao

oldboy

说明:s查找并替换,用一个字符串替换另一个字符串

      gglobal)与s联合使用时,表示对当前行全局替换

      #是分隔符号,可以用/@等替换

 

实例1-5   

问题:如何过滤出已知当前目录下/root中的所有一级目录(不包含var目录下面的目录及隐藏目录,即只能是一级目录)

命令:ls –l /root|sed –n ‘/^d/’p

代码

[root@ben-test ~]# ls -l /root |sed -n '/^d/'p

drwxr-xr-x  2 root root  4096 Sep 15 07:03 aa

drwxr-xr-x  3 root root  4096 Sep 15 03:34data

drwxr-xr-x 12 root root  4096 Sep 15 07:18test

 

实例1-6   

问题:把/root/data目录中含有oldboy字符的文件,都把oldboy替换成oldgirl

命令1sed –i ‘s#oldboy#oldgirl#g’ `grep–lr oldboy /root/data`

代码

[root@ben-test ~]# sed -i 's#oldboy#oldgirl#g'`grep -lr oldboy /root/data`

[root@ben-test ~]# grep -lr oldboy /root/data                             

[root@ben-test ~]# grep -lr oldgirl /root/data

/root/data/a.sh

/root/data/test/aa.txt

 

命令2sed –i ‘s#oldboy#oldgirl#g’ `find/root/data –type f –name “*”`

代码

[root@ben-test ~]# sed -i 's#oldboy#oldgirl#g'`find /root/data -type f -name "*"`

[root@ben-test ~]# grep -lr oldboy /root/data                             

[root@ben-test ~]# grep -lr oldgirl /root/data

/root/data/a.sh

/root/data/test/aa.txt

 

实例1-7   

问题:删除oldboy打印oldboy.txt中的内容,同时把liyao替换成oldgirl

命令:sed –e ‘/oldboy/’d–e ‘s#liyao#oldgirl#g’ /root/oldboy.txt

代码

[root@ben-test ~]# sed -e '/oldboy/'d -e's#liyao#oldgirl#g' oldboy.txt  (没有改变文件内容)

oldgirl

[root@ben-test ~]# cat oldboy.txt

oldboy

liyao

oldboy

说明:如果需要改变文件内容,如下

sed-e '/oldboy/'d –i -e 's#liyao#oldgirl#g' –i /root/oldboy.txt

 

实例1-8  追加内容到指定行后

文本内容如下,person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

 

代码

[root@ben-test ~]# sed '2a 106,dandan,CSO'person.txt

101,oldboy,CEO

102,zhangyao,CTO

106,dandan,CSO     <== 插入内容

103,Alex,COO

104,yy,CFO

105,feixue,CIO

说明:参数a是追加文本到指定行后,2a表示把内容追加到第二行的下一行

 

实例1-9  插入文本到指定行前

代码

[root@ben-test ~]# sed '2i 106,dandan,CSO'person.txt 

101,oldboy,CEO

106,dandan,CSO     <== 插入内容

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

说明:参数i是插入文本到指定行前,2i表示把内容插入到第二行的上一行

 

实例1-10           多行内容插入

代码

[root@ben-test ~]# sed '2a 106,dandan,CSO\n107,bingbing,CCO'person.txt

101,oldboy,CEO

102,zhangyao,CTO

106,dandan,CSO

107,bingbing,CCO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@ben-test ~]# sed '2a 106,dandan,CSO \   <== \符号是进入换行编辑

> 107,bingbing,CCO' person.txt

101,oldboy,CEO

102,zhangyao,CTO

106,dandan,CSO

107,bingbing,CCO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

说明:\n是换行符

 

注意sed软件可以对单行或多行进行处理。如果在sed命令前面不指定地址范围,那么默认会匹配所有行。

用法:n1[,n2]{sed-commands}

地址用逗号分隔的,n1,n2可以用数字、正则表达式、或二者的组合表示。

例子:

    10{sed-commands}        对第10行操作

   10,20{sed-commands}     对10到20行操作,包括第10,20行

   10,+20{sed-commands}   对10到30(10+20)行操作,包括第10,30行

   1~2{sed-commands}       对1,3,5,7,……行操作

   10,${sed-commands}     对10到最后一行($代表最后一行)操作,包括第10行

   /oldboy/{sed-commands}         对匹配oldboy的行操作

   /oldboy/,/Alex/{sed-commands}  对匹配oldboy的行到匹配Alex的行操作

   /oldboy/,${sed-commands}       对匹配oldboy的行到最后一行操作

   /oldboy/,10{sed-commands}      对匹配oldboy的行到第10行操作,注意:如果前10行没有匹配到oldboy,sed软件会显示10行以后的匹配oldboy的行,如果有。

   1,/Alex/{sed-commands}         对第1行到匹配Alex的行操作

   /oldboy/,+2{sed-commands}      对匹配oldboy的行到其后的2行操作

 

实例1-11           正则表达式匹配删除

代码

[root@ben-test ~]# sed '/zhangyao/,3d' person.txt

101,oldboy,CEO   (1)

104,yy,CFO      (4)

105,feixue,CIO   (5)

说明:匹配到zhangyao字符串,对此行到第3行操作删除

 

代码

[root@ben-test ~]# sed '/zhangyao/,+3d' person.txt

101,oldboy,CEO

说明:对匹配到zhangyao字符串,还有此行的后3行进行删除

 

代码

[root@ben-test ~]# sed '/^.*ex.*$/,4d'person.txt 

101,oldboy,CEO

102,zhangyao,CTO

105,feixue,CIO

说明:正则表达式匹配到含有ex字符的行,然后进行操作删除

 

实例1-12           用新行替换旧行

代码

[root@ben-test ~]# sed '2c 107,bingbing,CCO'person.txt

101,oldboy,CEO

107,bingbing,CCO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

说明:参数c是指定行数替换内容,2c是指定第二行