语法
sed [选项] [命令] [输入文件]
选项
-n :仅打印模式匹配的行,常与 p 搭配使用
-e :可进行多项编辑,即可对输入行使用多条 sed 命令,默认选项
-f :将 sed 的动作写在一个脚本文件内,用 -f filename 参数执行 filename 内的 sed 动作
-r :支持扩展表达式
-i :直接修改文件内容,如 sed -i 's/old/new/g' demo.txt
命令
a \text:append 在指定行后追加文本 text,支持使用 \n 实现多行追加;
i \text :insert 在指定行前插入文本 text,支持使用 \n 实现多行插入
c \text:将指定行的内容替换为文本 text
d :delete 删除匹配到的行
p :print 显示匹配到的行,通常 p 会与参数 sed -n 搭配使用
w /file:write 保存模式空间中匹配到的行至指定的文件中
r /file :read 将指定文件的内容读取至当前模式空间中被匹配到的行后面,常用于实现文件合并
sed -i '/Ethernet/r myfile' test 匹配Ethernet的行,读进来另一个文件的内容,读进来的文件的内容会插入到匹配Ethernet的行后
s/pattern/replaces/:查找pattern用replaces替换,分隔符可自行指定,常用的分隔符有/, #, @等;
替换标记:
g : 全局替换;
w /file : 将替换的结果保存至指定文件中;sed -i 's/pattern/replaces/w my.txt' test 将替换后的结果保存到my.txt中
p : 显示替换成功的行;
y : 用于(对应)转换字符;
= : 打印行号;
! : 匹配后取反;
l : 打印行号,并显示控制字符;
q : 读取匹配到的行后退出;
应用
- Demo Text
[root@localhost ~]# nl /etc/passwd | head -n5> demo.txt
[root@localhost ~]# cat demo.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
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
- a \text(在指定行后新增)
# 在第 2 行后新增一行且不改变源文件
[root@localhost ~]# sed '2a CONSTANT DROPPING WEARS THE STONE!' demo.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
CONSTANT DROPPING WEARS THE STONE!
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
# 使用 \n 在第 2 行后新增多行且不改变源文件
[root@localhost ~]# sed '2a CONSTANT DROPPING WEARS THE STONE! \nCONSTANT DROPPING WEARS THE STONE!' demo.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
CONSTANT DROPPING WEARS THE STONE!
CONSTANT DROPPING WEARS THE STONE!
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
[root@localhost ~]# cat demo.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
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
# 使用 -i 选项,在第 2 后插入内容并改变源文件
[root@localhost ~]# sed -i '2a CONSTANT DROPPING WEARS THE STONE!' demo.txt
[root@localhost ~]# cat demo.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
CONSTANT DROPPING WEARS THE STONE!
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
- i \text (在指定行前插入)
# 在第 3 行前插入一行且不改变源文件
[root@localhost ~]# sed '3i CONSTANT DROPPING WEARS THE STONE!' demo.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
CONSTANT DROPPING WEARS THE STONE!
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
# 使用 \n 插入多行且不改变源文件
[root@localhost ~]# sed '3i CONSTANT DROPPING WEARS THE STONE!\nCONSTANT DROPPING WEARS THE STONE' demo.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
CONSTANT DROPPING WEARS THE STONE!
CONSTANT DROPPING WEARS THE STONE
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
[root@localhost ~]# cat demo.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
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
# 使用 -i 选项,在第 4 行前插入一行且改变源文件
[root@localhost ~]# sed -i '4i CONSTANT DROPPING WEARS THE STONE!' demo.txt
[root@localhost ~]# cat demo.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
CONSTANT DROPPING WEARS THE STONE!
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
- c \text 取代指定行的内容,同理,加 -i 选项会修改源文件
# 替换 2-5 行之间的内容
[root@localhost ~]# sed '2,5c CONSTANT DROPPING WEARS THE STONE!' demo.txt
1 root:x:0:0:root:/root:/bin/bash
CONSTANT DROPPING WEARS THE STONE!
- d :delete 删除匹配到的行
# 删除第 3 行
[root@localhost ~]# sed '3d' demo.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
# 删除 第 2~4 行
[root@localhost ~]# sed '2,4d' demo.txt
1 root:x:0:0:root:/root:/bin/bash
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
# 删除奇数行
[root@localhost ~]# sed '1~2d' demo.txt
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
# 删除包含第 2 行后两行
[root@localhost ~]# sed '2,+2d' demo.txt
1 root:x:0:0:root:/root:/bin/bash
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
# 删除指定关键词(adm)行
[root@localhost ~]# sed '/adm/d' demo.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
- p :print 显示匹配到的行,通常 p 会与参数 sed -n 搭配使用
[root@localhost ~]# sed -n '/daemon/p' demo.txt
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
- s/old/new/:查找 old 用 new 替换
# 将 root 替换为 User
[root@localhost ~]# sed 's/root/User/g' demo.txt
1 User:x:0:0:User:/User:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
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
基础正则表达式字符
字符 | 意义 |
---|---|
^word | 搜寻的字串(word)在行首行 |
word$ | 搜寻的字串(word)在行尾 |
. | 匹配一个非换行符的字符,空格也算字符 如:/s.d/匹配s后接一个任意字符,然后是d |
* | 重复零个到无穷多个的前一个 RE 字符,* 之前必须要紧接着 一个 RE 字符 |
\ | 将特殊符号的特殊意义去除 |
[list] | 匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed |
[^list] | 匹配一个不在指定范围内的字符,反选 |
<word | 匹配以 word 开始的行,如:/\<word/ |
word> | 匹配以 word 结束的行,如/word\>/ |
x{m} | 重复字符x,m次,如:/0{5}/匹配包含5个o的行 |
x{m,} | 重复字符x,至少m次,如:/o{5,}/匹配至少有5个o的行 |
x{m,n} | 重复字符x,至少m次,不多于n次,如:/o{5,10}/匹配5--10个o的行 |
元字符应用
- Demo txt
[root@localhost ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.180.111.23 netmask 255.255.255.0 broadcast 10.180.111.255
inet6 fe80::250:56ff:fe28:3506 prefixlen 64 scopeid 0x20<link>
ether 00:50:56:28:35:06 txqueuelen 1000 (Ethernet)
RX packets 63780 bytes 11329572 (10.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1789 bytes 132928 (129.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- ^word 匹配所有以 空格开头的前两行
[root@localhost ~]# ifconfig ens33 | sed -n '/^ /p' | head -n 2
inet 10.180.111.23 netmask 255.255.255.0 broadcast 10.180.111.255
inet6 fe80::250:56ff:fe28:3506 prefixlen 64 scopeid 0x20<link>
- word$ 匹配所有以 255 结尾的行
[root@localhost ~]# ifconfig ens33 | sed -n '/^ /p' | head -n 2 | sed -n '/255$/p'
inet 10.180.111.23 netmask 255.255.255.0 broadcast 10.180.111.255
- . 匹配一个非换行符的字符 如:/r.r/匹配 r 后接一个任意字符,然后是 r
[root@localhost ~]# ifconfig ens33 | sed -n '/r.r/p'
RX errors 0 dropped 0 overruns 0 frame 0
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- [list] 匹配一个指定范围内的字符
[root@localhost ~]# ifconfig ens33 | sed -n '/[rt]s/p'
RX packets 67344 bytes 11695515 (11.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1799 bytes 133756 (130.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- [^list] 匹配一个不在指定范围内的字符
[root@localhost ~]# ifconfig ens33 | sed -n '/inet[^6]/p'
inet 10.180.111.23 netmask 255.255.255.0 broadcast 10.180.111.255
-/ \<word/ 匹配以 word 开始的行
[root@localhost ~]# ifconfig ens33 | sed -n '/\<ens33/p'
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
-/ word\>/ 匹配以 word 结束的行
[root@localhost ~]# ifconfig ens33 | sed -n '/255\>/p'
inet 10.180.111.23 netmask 255.255.255.0 broadcast 10.180.111.255
- x{m} 重复字符x,m次,如:/r{5}/ 匹配包含 2 个 r 的行
[root@localhost ~]# ifconfig ens33 | sed -n '/r\{2\}/p'
RX errors 0 dropped 0 overruns 0 frame 0
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- x{m,} 重复字符x,至少m次,如:/1{2,}/ 匹配至少有2 个 1 的行
[root@localhost ~]# ifconfig ens33 | sed -n '/1\{2,\}/p'
inet 10.180.111.23 netmask 255.255.255.0 broadcast 10.180.111.255
RX packets 72499 bytes 12252286 (11.6 MiB)
- 删除空白行
# sed 's/^\s*$/d' test.txt
# grep -v '^\s*$' test.txt
# awk NF test.txt
网友评论