9.4/9.5 sed

sed工具和awk工具就能把替换的文本输出到屏幕上,功能丰富。都是流式编辑器,是针对文档的行来操作的。

打印某行

sed命令格式为:sed -n 'n'p filename,单引号内的n是一个数字,表示第几行。-n选项的作用是只显示我们要打印的行。示例命令如下:

test11:x:1001:1002::/home/test11:/bin/bash
[root@bogon ~]# sed -n '2'p /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
[root@bogon ~]# sed -n '1,$'p /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

上例中为把所有行都打印出来,命令sed -n '1,$'p filename。

指定一个区域打印,如下所示:

[root@bogon ~]# sed -n '1,3'p /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

打印包含某个字符串的行

示例命令如下:

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

sed使用特殊字符(如^、$,.*d等)

[root@bogon ~]# sed -n '/^1/'p test.txt
111111111111111111111111111111
[root@bogon ~]# sed -n '/in$/'p test.txt
[root@bogon ~]# sed -n '/r..o/'p test.txt
roooot:x0:0:/rooooot:/bin/bash
[root@bogon ~]# sed -n '/ooo*/'p test.txt
roooot:x0:0:/rooooot:/bin/bash

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

[root@bogon ~]# sed -e '1'p -e '/111/'p -n test.txt

111111111111111111111111111111

删除某些行

示例命令如下:

[root@bogon ~]# sed -e '1'd test.txt
roooot:x0:0:/rooooot:/bin/bash
111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@bogon ~]# sed -e '1,3'd test.txt
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@bogon ~]# sed -e '/oot/'d test.txt

111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@bogon ~]#

这里参数d表示删除的动作,它不仅可以删除指定的单行以及多行,而且可以删除匹配某个字符的行,还可以删除从某一行开始到文档最后的一行的所有行。

替换字符或者字符串

示例命令如下:

[root@bogon ~]# sed 's#ot#to#g' test.txt

roooto:x0:0:/rooooto:/bin/bash
111111111111111111111111111111
[root@bogon ~]# sed 's@ot@to@g' test.txt

roooto:x0:0:/rooooto:/bin/bash
111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

删除文档中所有的数字或者字母?示例命令如下:

[root@bogon ~]# sed 's/[0-9]//g' test.txt

roooot:x::/rooooot:/bin/bash

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

[0-9]表示任意的数字。这里可以写成[a-zA-Z]或者[0-9a-zA-Z]。如下所示:

[root@bogon ~]# sed 's/[a-zA-Z]//g' test.txt

:0:0:/://
111111111111111111111111111111

调换两个字符串的位置

示例命令如下:

[root@bogon ~]# sed 's/\(rot\)\(.*\)\(bash\)/\3\2\1/' test.txt

roooot:x0:0:/rooooot:/bin/bash
111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

小括号在sed中属于特殊符号,必须在前面加转义字符\,替换时则写成类似\1,\2,或\3的形式。上例中用()把想替换的字符打包成了一个整体。有这个转义字符\,会让这个表达式看起来乱糟糟的。如下所示:

[root@bogon ~]# sed -r 's/(root)(.*)(bash)/\3\2\1/' test.txt

roooot:x0:0:/rooooot:/bin/bash
111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

-r选项让这个表达式更加清晰了。用sed在某一行前后增加指定的内容,如下所示:

[root@bogon ~]# sed 's/^.*$/123&/' test.txt
123
123roooot:x0:0:/rooooot:/bin/bash
123111111111111111111111111111111
123aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

直接修改文件的内容

示例命令如下:

[root@bogon ~]# sed -i 's/ot/to/g' test.txt
[root@bogon ~]# cat test.txt

roooto:x0:0:/rooooto:/bin/bash
111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

可以直接修改test.txt文件中的内容了。在修改前备份文件。