一、什么是 sed¶
sed 是 Linux 中非常经典的流编辑器,常用于:
- 取行
- 过滤
- 替换
- 删除
- 批量修改文本内容
它最大的特点是:可以不打开编辑器,直接在命令行中对文本进行快速处理。
二、sed 的基本格式¶
2.1 基本结构¶
sed [选项] '条件动作' 文件
2.2 常见选项¶
| 选项 | 说明 |
|---|---|
-n |
取消默认输出,只显示符合条件的内容 |
-r |
支持扩展正则 |
-i |
直接修改文件 |
-i.bak |
先备份,再修改文件 |
三、查询与取行操作¶
3.1 取指定行¶
取出 /etc/passwd 第 3 行:
$ sed -n '3p' /etc/passwd
取出第 2 行到第 5 行:
$ sed -n '2,5p' /etc/passwd
3.2 按内容匹配¶
过滤出包含 root 的行:
$ sed -n '/root/p' /etc/passwd
取出从匹配 102 到匹配 105 的内容范围:
$ sed -n '/102/,/105/p' a.txt
3.3 组合打印¶
只显示第 1 行和第 5 行:
$ sed -n '1p;5p' /etc/passwd
打印奇数行:
$ seq 10 | sed -n '1~2p'
打印偶数行:
$ seq 10 | sed -n '2~2p'
四、替换操作¶
4.1 基础替换¶
把 a.txt 中的 I 替换成 i:
$ sed -i 's/I/i/g' a.txt
先备份再替换:
$ sed -i.bak 's/I/i/g' a.txt
4.2 分组替换与反向引用¶
把 12345678 加工成 1<234567>8:
$ echo 12345678 | sed -r 's#(1)(.*)(8)#\1<\2>\3#g'
1<234567>8
调整 /etc/passwd 某些字段顺序时,也可以使用分组和反向引用:
$ sed -r 's#^(.*)(:x.*:)(.*$)#\3\2\1#g' passwd
4.3 实战:提取 IP 和权限位¶
提取网卡 IP:
$ ip a s ens33 | sed -rn '3 s#^.*inet ([0-9.]+)/.*$#\1#g p'
提取 stat /etc/hosts 中的 0644 权限位:
$ stat /etc/hosts | sed -n '4p' | sed -r 's#^.*\(([0-9]+)/.*$#\1#g'
五、删除操作¶
删除第 3 行:
$ sed '3d' sed.txt
删除空行和注释行:
$ sed -r '/^$|#/d' /etc/ssh/sshd_config
反向思路:只保留不是空行、也不是注释的内容:
$ sed -nr '/^$|#/!p' /etc/ssh/sshd_config
六、追加、插入与替换整行¶
6.1 追加内容¶
在第 3 行后面追加一行:
$ sed '3a 123456' a.txt
6.2 插入内容¶
在第 3 行上面插入一行:
$ sed '3i 123456' a.txt
6.3 替换整行¶
把第 3 行整行替换成 123456:
$ sed '3c 123456' a.txt
七、小结¶
学习 sed 时,建议先把操作分成四类:
p:取行和显示s///:替换d:删除a、i、c:新增、插入、替换整行
只要先掌握这四类动作,再配合正则表达式,sed 就能解决很多批量文本处理问题。