sed:Stream Editor,流式编辑器
-非交互,基于模式匹配过滤及修改文本
-逐行处理,并将结果输出到屏幕
-可实现对文本的输出,删除,替换,复制,剪切,导入,导出等各种操作
sed常用的选项:
-n (屏蔽默认输出,默认sed会输出读取文档的全部内容)
-r (让sed支持扩展正则)
-i (sed直接修改源文件,默认sed只是通过内存临时修改文件,源文件无影响)
[root@localhost ~]# sed -n '1p;4p' a.txt #打印第一行和第四行
aaaaaa
dddddd
[root@localhost ~]# sed -n '1,3p' a.txt #打印1到3行
aaaaaa
bbbbbb
cccccc
[root@localhost ~]# sed -n '2,+2p' a.txt #打印第2行以及之后的2行。
bbbbbb
cccccc
dddddd
[root@localhost ~]# sed -n '1~2p' a.txt #打印奇数行
aaaaaa
cccccc
eeeeee
gggggg
[root@localhost ~]# sed -n '2~2p' a.txt #打印偶数行
bbbbbb
dddddd
ffffff
[root@localhost ~]# cat -n /etc/passwd | sed -n '3,+10p' #sed可以配合管道使用
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
[root@localhost ~]# sed -n '/bash$/p' /etc/passwd #找到bash结尾的行打印出来
root:x:0:0:root:/root:/bin/bash
usetr:x:1000:1000:usetr:/home/usetr:/bin/bash
sed工具的p、d、s操作
p=打印,d=删除,s=替换
[root@localhost ~]# sed -n '$=' a.txt #打印文件一共有几行
7
[root@localhost ~]# sed -n '/^root/=' /etc/passwd #以root开头的行号
1
[root@localhost ~]# sed -n '/root/=' /etc/passwd #包含root的行号
1
10
[root@localhost ~]# sed '3,5d' a.txt #删除3到5行
aaaaaa
bbbbbb
ffffff
gggggg
[root@localhost ~]# sed '/xml/d' a.txt #删除包含xml字符的行
[root@localhost ~]# sed '/xml/!d' a.txt #删除没有包含xml的行
[root@localhost ~]# sed '/^install/d' a.txt #删除以install开头的行
[root@localhost ~]# sed '$d' a.txt #删除文件的最后一行
[root@localhost ~]# sed '/^$/d' a.txt #删除所有空白行
[root@localhost ~]# cat b.txt
2017 2011 2018
2017 2017 2024
2017 2017 2017
[root@localhost ~]# sed 's/2017/xxxx/g' b.txt #用xxxx替换2017
xxxx 2011 2018
xxxx xxxx 2024
xxxx xxxx xxxx
[root@localhost ~]# sed 's/2017/xxxx/2' b.txt #替换每行的第2个2017
2017 2011 2018
2017 xxxx 2024
2017 xxxx 2017
[root@localhost ~]# sed 's/2017//' b.txt #每行都删除一个2017
2011 2018
2017 2024
2017 2017
[root@localhost ~]# sed 's/2017//g' b.txt #所有的2017都删除
2011 2018
2024
[root@localhost ~]# sed -n 's/2017/xxxx/p' b.txt #替换每行的第一个2017并打印出来
xxxx 2011 2018
xxxx 2017 2024
xxxx 2017 2017
[root@localhost ~]# sed -n 's#/bin/bash#/sbin/sh#p' /etc/passwd #将/bin/bash替换为/sbin/sh,这里分隔符是用的#
root:x:0:0:root:/root:/sbin/sh
usetr:x:1000:1000:usetr:/home/usetr:/sbin/sh
[root@localhost ~]# sed -r 's/^(.)(.*)(.)/\3\2\1/' b.txt #将每行的第一个字符和最后一个调换
8017 2011 2012
4017 2017 2022
7017 2017 2012
[root@localhost ~]# sed -r 's/^(.)(.)(.*)(.)(.)/\1\4\3\2\5/' b.txt #将每行的第2个字符和倒数第二个调换
2117 2011 2008
2217 2017 2004
2117 2017 2007
[root@localhost ~]# sed 's/.$//' b.txt #删除每行最后一位
2017 2011 201
2017 2017 202
2017 2017 201
[root@localhost ~]# sed 's/[0-9]//' b.txt #删除每行的第一个数字
017 2011 2018
017 2017 2024
017 2017 2017
[root@localhost ~]# sed -r 's/[0-9]//g;s/^()+//' c.txt #删除所有的数字和行首的空格
Hello the world
ni hao ma shenzhen
[root@localhost ~]# sed -r 's/([A-Z])/[\1]/g' c.txt #为文件中每个大写字母添加括号
[H]ello the world
ni hao ma shenzhen