sed

2018-10-17  本文已影响0人  XiaoMing丶

sed工具

sed是一种功能强大的流编辑器,是针对文档的行来操作的。它能对文档查找、替换并且将替换结果显示到屏幕。

[root@minglinux ~]# cat test.txt
aaaaaaaaaabbbb
root
12345678
@#%%&^*(
[root@minglinux ~]# sed -n '2'p test.txt
root
[root@minglinux ~]# sed '2'p test.txt   \\去掉-n
aaaaaaaaaabbbb
root
root
12345678
@#%%&^*(
[root@minglinux ~]# sed -n '1,3'p test.txt  \\打印指定区间的行
aaaaaaaaaabbbb
root
12345678
[root@minglinux ~]# sed -n '1,$'p test.txt   \\打印所有行
aaaaaaaaaabbbb
root
12345678
@#%%&^*(

上例我们可以看到,sed '2'p test.txt去掉-n选项时,屏幕显示打印了第二行两次,这是因为sed默认会打印文件中所有行。

[root@minglinux ~]# cat test.txt
aaaaaaaaaabbbb
root
12345678
@#%%&^*(
[root@minglinux ~]# sed -n '/aa/'p test.txt
aaaaaaaaaabbbb
[root@minglinux ~]# sed -n '/^1/'p test.txt
12345678
[root@minglinux ~]# sed -n '/($/'p test.txt
@#%%&^*(
[root@minglinux ~]# sed -n '/r.o/'p test.txt
root
[root@minglinux ~]# sed -n '/oo*/'p test.txt
root

sed命令加上-e选项可以实现多个行为,如下所示:

[root@minglinux ~]# sed -e '3'p -e '/root/'p -e '/^a/'p -n test.txt
aaaaaaaaaabbbb
root
12345678
[root@minglinux ~]# cat test.txt
aaaaaaaaaabbbb
root
12345678
@#%%&^*(
[root@minglinux ~]# sed '4'd  test.txt
aaaaaaaaaabbbb
root
12345678
[root@minglinux ~]# sed '1,3'd  test.txt
@#%%&^*(
[root@minglinux ~]# sed '/roo/'d  test.txt
aaaaaaaaaabbbb
12345678
@#%%&^*(
[root@minglinux ~]# cat test.txt
aaaaaaaaaabbbb
root
12345678
@#%%&^*(
abcdef
[root@minglinux ~]# sed '1s/a/A/g' test.txt
AAAAAAAAAAbbbb
root
12345678
@#%%&^*(
abcdef
[root@minglinux ~]# sed '1s/a/A/' test.txt
Aaaaaaaaaabbbb
root
12345678
@#%%&^*(
abcdef
[root@minglinux ~]# sed 's/a/A/' test.txt
Aaaaaaaaaabbbb
root
12345678
@#%%&^*(
Abcdef
[root@minglinux ~]# sed 's/a/A/g' test.txt
AAAAAAAAAAbbbb
root
12345678
@#%%&^*(
Abcdef

除了可以使用/作为分隔符外,我们还可以使用其他特殊字符,例如#和@。

删除文档中所有的数字和字母的命令如下:

[root@minglinux ~]# cat test.txt
aaaaaaaaaabbbb
root
12345678
@#%%&^*(
abcdef
[root@minglinux ~]# sed 's/[0-9a-zA-Z]//g' test.txt



@#%%&^*(

[root@minglinux ~]# cat test.txt
aaaaaaaaaabbbb
root
12345678
@#%%&^*(
abcdef
[root@minglinux ~]# sed 's/\(r\)\(.*\)\(t\)/\3\2\1/' test.txt
aaaaaaaaaabbbb
toor
12345678
@#%%&^*(
abcdef

小括号在sed中属于特殊符号,必须在前面加转义字符\,替换时则写成类似\1、\2或\3的形式。上例中用()把想要替换的字符打包成了一个整体。使用这么多的转义符让命令行看着很乱,我们使用sed加-r选项可以省去转义符,所下所示:

[root@minglinux ~]# sed -r 's/(r)(.*)(t)/\3\2\1/' test.txt
aaaaaaaaaabbbb
toor
12345678
@#%%&^*(
abcdef
[root@minglinux ~]# sed '1s/^.*$/&123/' test.txt
aaaaaaaaaabbbb123
root
12345678
@#%%&^*(
abcdef
[root@minglinux ~]# sed 's/^.*$/123&/' test.txt
123aaaaaaaaaabbbb
123root
12312345678
123@#%%&^*(
123abcdef
[root@minglinux ~]# cat test.txt
aaaaaaaaaabbbb
root
12345678
@#%%&^*(
abcdef
[root@minglinux ~]# sed -i 's/123/abc/g' test.txt
[root@minglinux ~]# cat test.txt
aaaaaaaaabbbb
root
abc45678
@#%%&^*(
abcdef
上一篇 下一篇

猜你喜欢

热点阅读