1. 基本格式与常用选项

基本格式:

命令 | sed [选项] '条件'
sed [选项] '条件' 文件 . . .

常用选项:

-n:默认sed会输出文件的全部内容,使用该选项可以屏蔽默认输出。
-r:sed默认是不支持扩展正则的,该选项可以支持。
-i:在指定的行之前插入内容,sed默认不加该选项是在内存临时修改源文件的,不会对文件产生影响,加上此选项会修改原文件的内容,建议修改前先备份。
$:表示匹配结尾。
$=:匹配到文件最后一行,并且输出行号。
!:取反。
^:以什么开头。
p:打印。
d:删除。
s:替换。
a:在指定的行之后插入内容。
c:替换指定的行。

2. 实战案例

范例:-n选项

# 如不加-n选项,默认会全部输出,并且命令指定了输出第一行,所以第一行就会显示两次
[root@VM-20-5-opencloudos ~]# sed '1p' /etc/hosts 
127.0.0.1 VM-20-5-opencloudos VM-20-5-opencloudos
127.0.0.1 VM-20-5-opencloudos VM-20-5-opencloudos
127.0.0.1 localhost.localdomain localhost
127.0.0.1 localhost4.localdomain4 localhost4

::1 VM-20-5-opencloudos VM-20-5-opencloudos
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6

# 加上-n选项就只输出一行了
[root@VM-20-5-opencloudos ~]# sed -n '1p' /etc/hosts 
127.0.0.1 VM-20-5-opencloudos VM-20-5-opencloudos

# 打印/etc/passwd 3-6行内容
[root@VM-20-5-opencloudos ~]# sed -n '3,6p' /etc/passwd
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

范例:-i选项

# 通过-d取删除passwd文件中的所有行,查看并未删除
[root@VM-20-5-opencloudos ~]# sed 'd' passwd 
[root@VM-20-5-opencloudos ~]# cat passwd 

# 加上-i选项成功删除passwd文件1-4行内容(我这里passwd文件是备份出来的,你们不要删错了!!!)
[root@VM-20-5-opencloudos ~]# sed -i '1,4d' passwd 
[root@VM-20-5-opencloudos ~]# cat passwd 

# 分号隔离,打印passwd文件1行和4行内容
[root@VM-20-5-opencloudos ~]# sed -n '1p;4p' passwd 
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt

范例:条件

# 打印passwd第三行
[root@VM-20-5-opencloudos ~]# sed -n '3p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin

# 打印passwd第三行到第五行
[root@VM-20-5-opencloudos ~]# sed -n '3,5p' /etc/passwd
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

# 打印passwd第三行和第五行
[root@VM-20-5-opencloudos ~]# sed -n '3p;5p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

# 打印奇数行,1~2这是一个地址范围的模式,1~2 表示从第一行开始,每隔两行匹配一次,也就是只打印奇数。
[root@VM-20-5-opencloudos ~]# cat 3.txt
1
2
3
4
5
6
7
8
[root@VM-20-5-opencloudos ~]# sed -n '1~2p' 3.txt
1
3
5
7

# 打印偶数行
[root@VM-20-5-opencloudos ~]# sed -n '2~2p' 3.txt
2
4
6
8

# 打印包含root的行
[root@VM-20-5-opencloudos ~]# sed -n '/root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

# 打印bash结尾的行
[root@VM-20-5-opencloudos ~]# sed -n '/bash$/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
lighthouse:x:1000:1000::/home/lighthouse:/bin/bash
xiaoxu:x:1001:1001::/home/xiaoxu:/bin/bash
mage:x:1002:1002::/home/mage:/bin/bash

范例:p指令

# 输出所有行
[root@VM-20-5-opencloudos ~]# sed -n 'p' 3.txt
1
2
3
4
5
6
7
8

# 输出第四行
[root@VM-20-5-opencloudos ~]# sed -n '4p' 3.txt
4

# 输出第4~7行
[root@VM-20-5-opencloudos ~]# sed -n '4,7p' 3.txt
4
5
6
7

# 输出以root开头的行
[root@VM-20-5-opencloudos ~]# sed -n '/^root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash

# 输出文件的行数
[root@VM-20-5-opencloudos ~]# sed -n '$=' 3.txt
8

范例:d指令

# 删除第3~5行
[root@VM-20-5-opencloudos ~]# sed  '3,5d' 3.txt
1
2
6
7
8

# 删除包含qq的行
[root@VM-20-5-opencloudos ~]# sed '/qq/d' 3.txt
1
2
3
4
5
6
7
8
ww
ee

# 删除不包含qq的行
[root@VM-20-5-opencloudos ~]# sed '/qq/!d' 3.txt
qq

# 删除wo开头的行
[root@VM-20-5-opencloudos ~]# sed '/^wo/d' 3.txt
1
2
3
4
5
6
7
8
qq
ww
ee

# 删除文件的最后一行
[root@VM-20-5-opencloudos ~]# sed '$d' 3.txt
1
2
3
4
5
6
7
8
wo shi sed
qq
ww

# 删除所有空行
[root@VM-20-5-opencloudos ~]# cat 3.txt
1

2
3

4

5
6
7
8
wo shi sed
qq
ww
ee

[root@VM-20-5-opencloudos ~]# sed '/^$/d' 3.txt
1
2
3
4
5
6
7
8
wo shi sed
qq
ww
ee

范例:s指令

# 演员1
[root@VM-20-5-opencloudos ~]# cat 01.txt 
2022 2011 2017 2017
2017 2011 2022
2011 2022 2017
[root@VM-20-5-op

# 把2017替换为xxx,但是如果不加g选项,sed只会替换每一行的第一个2017,如果出现第二次就无法替换。
[root@VM-20-5-opencloudos ~]# sed 's/2017/xxx/' 01.txt 
2022 2011 xxx 2017
xxx 2011 2022
2011 2022 xxx


# 使用g选项全局替换
[root@VM-20-5-opencloudos ~]# sed 's/2017/123/g' 01.txt 
2022 2011 123 123
123 2011 2022
2011 2022 123

# 2指定仅替换每行中的第二个匹配项
[root@VM-20-5-opencloudos ~]# sed 's/2017/456/2' 01.txt 
2022 2011 2017 456
2017 2011 2022
2011 2022 2017


[root@VM-20-5-opencloudos ~]# sed -n 's/2017/xxxxx/pg' 01.txt 
2022 2011 xxxxx xxxxx
xxxxx 2011 2022
2011 2022 xxxxx
# 演员2
[root@VM-20-5-opencloudos ~]# cat 02.txt 
xml xml xml
xml xml
/bin/bash
#an
1
1
1
2
2
23
4
5
6

# 将每行中的第一个xml替换为大写的XML
[root@VM-20-5-opencloudos ~]# sed 's/xml/XML/' 02.txt 
XML xml xml
XML xml
/bin/bash
#an
1
1
1
2
2
23
4
5
6

# 将每行中的第三个xml替换为大写的XML
[root@VM-20-5-opencloudos ~]# sed 's/xml/XML/3' 02.txt 
xml xml XML
xml xml
/bin/bash
#an
1
1
1
2
2
23
4
5
6

# 将所有的xml都替换为大写的XML
[root@VM-20-5-opencloudos ~]# sed 's/xml/XML/g' 02.txt 
XML XML XML
XML XML
/bin/bash
#an
1
1
1
2
2
23
4
5
6

# 将所有的xml都替换为空字符串
[root@VM-20-5-opencloudos ~]# sed 's/xml//g' 02.txt 
  
 
/bin/bash
#an
1
1
1
2
2
23
4
5
6

# 将/bin/bash替换为/sbin/sh,这里我用的是@@@做分隔也可以###,就不要转义了。
[root@VM-20-5-opencloudos ~]# sed 's@/bin/bash@/sbin/sh@g' 02.txt 
xml xml xml
xml xml
/sbin/sh
#an
1
1
1
2
2
23
4
5
6

[root@VM-20-5-opencloudos ~]# sed 's/\/bin\/bash/\/sbin\/sh/g' 02.txt 
xml xml xml
xml xml
/sbin/sh
#an
1
1
1
2
2
23
4
5
6

# 将第5~10行都注释掉
[root@VM-20-5-opencloudos ~]# sed '5,10s/^/#/' 02.txt 
xml xml xml
xml xml
/bin/bash
an
#1
#1
#1
#2
#2
#23
4
5
6

# 去除#an的注释
[root@VM-20-5-opencloudos ~]# sed 's/^#an/an/' 02.txt 
xml xml xml
xml xml
/bin/bash
an
1
1
1
2
2
23
4
5
6

范例:sed修改系统配置

[root@VM-20-5-opencloudos ~]# cat installftp.sh 
#!/bin/bash
# 安装软件
yum -y install vsftpd
# 备份配置文件
cp /etc/vsftpd/vsftpd.conf{,.bak}
# 修改配置文件,开启匿名上传
sed -i 's/^#anon/anon/' /etc/vsftpd/vsftpd.conf
# 赋予权限
chmod 777 /var/ftp/pub
# 启动并开机自启
systemctl start vsftpd
systemctl enable vsftpd


[root@VM-20-5-opencloudos ~]# bash installftp.sh 


# 验证
[root@VM-20-5-opencloudos ~]# cat /etc/vsftpd/vsftpd.conf | grep 'anon'
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=NO
# Uncomment this to allow the anonymous FTP user to upload files. This only
# When SELinux is enforcing check for SE bool allow_ftpd_anon_write, allow_ftpd_full_access
anon_upload_enable=YES
# Uncomment this if you want the anonymous FTP user to be able to create
anon_mkdir_write_enable=YES
# If you want, you can arrange for uploaded anonymous files to be owned by
# You may specify a file of disallowed anonymous e-mail addresses. Apparently

范例:多行文本处理

# 演员3
[root@VM-20-5-opencloudos ~]# cat 03.txt 
1
2
3
4
5
6
7

# 在第二行后面插入xxx
[root@VM-20-5-opencloudos ~]# sed '2a xxx' 03.txt 
1
2
xxx
3
4
5
6
7

# 在第二行前面插入xxx
[root@VM-20-5-opencloudos ~]# sed '2i xxx' 03.txt 
1
xxx
2
3
4
5
6
7

# 将第二行替换为xxx
[root@VM-20-5-opencloudos ~]# sed '2c xxx' 03.txt 
1
xxx
3
4
5
6
7

# 主机名称修改替换
[root@VM-20-5-opencloudos ~]# cat /etc/hostname 
VM-20-5-opencloudos
[root@VM-20-5-opencloudos ~]# sed '1c xiaoxu-opencloudos' /etc/hostname 
xiaoxu-opencloudos

# 修改hosts文件,添加新内容
[root@VM-20-5-opencloudos ~]# cat /etc/hosts 
127.0.0.1 VM-20-5-opencloudos VM-20-5-opencloudos
127.0.0.1 localhost.localdomain localhost
127.0.0.1 localhost4.localdomain4 localhost4

::1 VM-20-5-opencloudos VM-20-5-opencloudos
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6

[root@VM-20-5-opencloudos ~]# sed -i '$a 192.168.3.253 xiaoxu.server' /etc/hosts 
[root@VM-20-5-opencloudos ~]# cat /etc/hosts 
127.0.0.1 VM-20-5-opencloudos VM-20-5-opencloudos
127.0.0.1 localhost.localdomain localhost
127.0.0.1 localhost4.localdomain4 localhost4

::1 VM-20-5-opencloudos VM-20-5-opencloudos
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6

192.168.3.253 xiaoxu.server