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