sed是一个非交互性的流编辑器,是stream editor的缩写。sed每次只处理一行内容,可以对文本或标准输入流进行处理。需要注意的是,sed并不直接操作初始数据,它操作的是一份原始数据的拷贝。sed处理时,把当前处理的行存储在临时缓冲区中,然后处理缓冲区中的内容,处理完成后,如果没有重定向到文件, 将把缓冲区中的内容送往屏幕,接着处理下一行直到处理完毕。
理论的东东,这里不谈了,下面谈些常规应用吧。
在演示之前,我们先构筑个初始文件orig.txt 和append.txt
[root@localhost .shell]# cat orig.txt
id nameprice address
--------------------------------
1 apple $50 USA
2 pear$60 Canda
3 pen $1 China
--------------------------------
total $111
[root@localhost .shell]# cat append.txt
4 apple $50 USA
5 $60 Canda
6 pen $1 China
1、打印指定行
a)打印第一行
[root@localhost .shell]# sed -n '1p' orig.txt
id nameprice address
b)打印3-5行
[root@localhost .shell]# sed -n '3,5p' orig.txt
1 apple $50 USA
2 pear$60 Canda
3 pen $1 China
c)打印最后一行
[root@localhost .shell]# sed -n '$p' orig.txt
total $111
d)打印所有行
[root@localhost .shell]# sed -n '1,$p' orig.txt
id nameprice address
-------------------------------
1 apple $50 USA
2 pear$60 Canda
3 pen $1 China
--------------------------------
total $111
e)打印含有pen的行
[root@localhost .shell]# sed -n '/pen/p' orig.txt
3 pen $1 China
f)从第一行开始打印,打印到第一个含有$行
[root@localhost .shell]# sed -n '1,/\$/'p orig.txt
id nameprice address
-------------------------------
1 apple $50 USA
2、打印含有元数据$行的行号
[root@localhost .shell]# sed -n '/\$/=' orig.txt
3
4
5
7
3、替换
a)把-替换为空
[root@localhost .shell]# sed -e 's/-*//g' orig.txt
id nameprice address
1 apple $50 USA
2 pear$60 Canda
3 pen $1 China
total $111
b)把元数据$替换为¥
[root@localhost .shell]# sed 's/\$/¥/g' orig.txt
id nameprice address
-------------------------------
1 apple ¥50USA
2 pear¥60Canda
3 pen ¥1 China
--------------------------------
total ¥111
c)-替换为空,并删除空行
[root@localhost .shell]# sed -e 's/-*//g' -e '/^$/'d orig.txt
id nameprice address
1 apple $50 USA
2 pear$60 Canda
3 pen $1 China
total $111
d)把含有total的行,替换为******
[root@localhost .shell]# sed '/total/c\******' orig.txt
id nameprice address
-------------------------------
1 apple $50 USA
2 pear$60 Canda
3 pen $1 China
--------------------------------
******
4、删除,删除前两行
[root@localhost .shell]# sed '1,2d' orig.txt
1 apple $50 USA
2 pear$60 Canda
3 pen $1 China
--------------------------------
total $111
5、添加
a)在含有apple的行前插入一行 0 nothing $5 USA
[root@localhost .shell]# sed '/apple/i\0 nothing $5 USA' orig.txt
id nameprice address
-------------------------------
0 nothing $5 USA
1 apple $50 USA
2 pear$60 Canda
3 pen $1 China
--------------------------------
b)在含有pen的行后插入一行4 four $5 USA
[root@localhost .shell]# sed '/pen/a\4 four $5 USA' orig.txt
id nameprice address
-------------------------------
1 apple $50 USA
2 pear$60 Canda
3 pen $1 China
4 four $5 USA
--------------------------------
total $111
c)在含有pen的行后面追加append.txt 文件的内容
[root@localhost .shell]# sed '/pen/r append.txt' orig.txt
id nameprice address
-------------------------------
1 apple $50 USA
2 pear$60 Canda
3 pen $1 China
4 apple $50 USA
5 $60 Canda
6 pen $1 China
--------------------------------
total $111
6、导出文件
a)把含有$的行导出到out.txt文件中
[root@localhost .shell]# sed -n '/\$/w out.txt' orig.txt
[root@localhost .shell]# cat out.txt
1 apple $50 USA
2 pear$60 Canda
3 pen $1 China
total $111
b)把含有apple的行输出到apple.txt文件中
[root@localhost .shell]# sed -n '/apple/'p orig.txt > apple.txt
[root@localhost .shell]# cat apple.txt
1 apple $50 USA