一、什么是 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:删除
  • aic:新增、插入、替换整行

只要先掌握这四类动作,再配合正则表达式,sed 就能解决很多批量文本处理问题。