sed:stream editor

1,非交互,基于模式匹配过滤及修改文本

2,逐行处理,并将结果输出到屏幕上

3,可实现对文本的输出,删除,替换,复制,剪切,导入,导出等各种操作

格式

sed  [选项] '[定址符]处理动作'  文件列表(多个文件用空格隔开)

命令 | sed  [选项] '[定址符]处理动作'

定址符:作用是控制处理动作处理数据的范围,不指定是默认处理读入的所有数据。其可以是行号或者正则表达式

[root@redhat ~]# sed  -n '1,3p' /etc/hosts   //把1到3行输出

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.200.133www.ldh.com

192.168.200.133bbs.ldh.com

        

选项:

-r 启动扩展的正则表达式,去掉用来转义特殊字符的转义符

-n 屏蔽掉对源数据的输出

-i 直接对源文件进行修改

-f 后接sed脚本文件

-e 执行多个处理动作时需要的参数,默认一个处理动作省略

{ }组合多个命令,以分号隔开

 

以下是经常用到的基本操作:

处理动作

d  删除

~ 跨步

head -n -b 10 /etc/passwd |sed '1~3d' 读取三行删除三行中的第一行

p  打印

s  字符串替换  

        s/old/new/将每行的第一个old替换成new

        s/old/new/g将所有的old都替换成new

注意:替换操作的分隔符不一定是"/"你可以改成其他字符,比如#、$等,但是后面的必须要和前面的一致才行

i 行前插入文本      2iyy  在第二行之前插入yy

a 行后插入文本      2ayy   在第二行之后插入yy

c  替换当前行       2cyy   将第二行的内容替换为yy

r 读入其他文件      3r b.txt  在第三行的下面插入文件b.txt;

                    4,7r b.txt  在第4-7每一行后插入文件b.txt

w 写入其他文件      3w c.txt   将第三行的另存为文件c.txt

                    4,7w c.txt  将第4-7行另存为c.txt

H 模式空间追加到保持空间  >>

h 模式空间覆盖到保持空间  >

上面是复制功能

G 保持空间追加到模式空间

g 保持空间覆盖到模式空间

这是粘贴功能

模式空间和保持空间下面有稍微一点的介绍和一些例子

处理动作--打印  p

sed -n 'p' a.txt  输出全部行

sed -n '2p' a.txt 输出2行

sed -n '2,5p' a.txt  输出2到5行

sed -n '2,+10p' a.txt 输出从第二行及其后的10行内容

sed -n '/^bin/p' a.txt 输出以bin开头的行

sed -n 'p;n' a.txt 输出奇数行

sed -n 'n;p' a.txt  输出偶数行,n表示读入下一行文本(隔行读)

sed -n '$=' a.txt  输出文件的行数

处理动作--删除  d

sed ‘3,5d’ a.txt  删除3到5行

sed  '/xml/d' a.txt 删除所有含有xml的行

sed '/xml/!d' a.txt 删除不包含xml的行,!表示取反

sed '^install/d' 删除以install开头的行

sed '$d' a.txt  删除文件的最后一行

sed '/^$/d' 删除空白航

注意:这些只做输出,不更改源文件

处理动作--替换  s/old/new

sed  's/xml/XML/'  a.txt 将每一行的第一个xml替换成XML

sed  's/xml/XML/3' a.txt  将每一行的第三个xml替换成XML

sed  's/xml/XML/g' a.txt  将所有的xml替换成XML

sed  's/xml//g' a.txt  将所有的xml删除

sed  's/xml/&s/g' a.txt  将所有的xml替换成xmls,此处,注意&符号的应用,就代表xml

sed  '4,7s/^/#/' a.txt  将4到7行注释掉

sed  's/^#an/an/' a.txt  解除以#an开头的行的注释(即去掉行首的#)

处理动作--插入文本

[root@localhost shell]# sed '2axx\

> yy' alert.txt

aa

bb

xx

yy

cc

dd

ee

ff

或者

[root@localhost shell]# sed '2axx\nyy' alert.txt 

aa

bb

xx

yy

cc

dd

ee

ff

处理动作--导入导出

把b.txt插入alert.txt第2行下

[root@localhost shell]# sed '2r b.txt' alert.txt 

aa

bb

this is a test!

cc

dd

ee

ff

也是使用正则表达式的

[root@localhost shell]# sed '/cc/r b.txt' alert.txt 

aa

bb

cc

this is a test!

dd

ee

ff

将a.txt文件中的1-2行导出到c.txt,c.txt无需事先存在

[root@localhost shell]# sed '1,2w c.txt' alert.txt

aa

bb

cc

dd

ee

ff

[root@localhost shell]# cat c.txt 

aa

bb

sed自带的两个空间:

模式空间:把要处理的行读入主机的模式空间中,然后用处理动作处理,处理完后输出处理后的结果,并把源数据输出,然后读入下一行到模式空间处理。

保持空间:保持空间不存储数据,默认只保存一个换行符\n。要想保存数据放到此空间,要手动把数据存进去,保持空间只存数据,不会输出数据,要想把保持空间的数据被sed处理,必须手动把保持空间里的数据调入模式空间

保持空间只负责存储数据,不负责输出和处理数据,也不会主动存放数据

处理动作--复制粘贴

把第1-3行复制到文件末尾

[root@localhost shell]# sed '1,3H;$G' alert.txt 

aa

bb

cc

dd

ee

ff

aa

bb

cc

把1-3行剪切到文件末尾

[root@localhost shell]# sed '1h;2,3H;1,3d;$G' alert.txt 

dd

ee

ff

aa

bb

cc