⚙️ 一、Sed简介
Sed(Stream Editor) 是Linux/Unix系统中的流式文本编辑器,以非交互方式逐行处理文本,执行查找、替换、删除、插入等操作。其核心特点是高效处理大文件,通过模式空间(Pattern Space)缓存当前处理行,编辑后输出结果,不直接修改源文件(除非使用 -i 选项)
🛠️ 二、核心功能与语法
1.常用选项
| 选项 | 作用 |
|---|---|
-n | 抑制默认输出,仅打印处理过的行(常与 p 命令联用) |
-e | 执行多条命令(例:sed -e 's/a/b/' -e 's/c/d/') |
-i[.bak] | 直接修改源文件(.bak 为备份后缀) |
-r | 启用扩展正则表达式(支持 +、? 等元字符) |
-f | 从文件读取脚本命令 |
2. 地址范围控制
通过行号或正则表达式限定操作范围:
- 单行:
sed '5s/old/new/'(仅第5行替换) - 行区间:
sed '1,10d'(删除1-10行) - 模式匹配:
sed '/error/d'(删除含"error"的行) - 混合定位:
sed '/start/,/end/s/old/new/'(匹配start到end的行替换)
⚡️ 三、常用操作命令
1. 替换文本(s 命令)
sed 's/原文本/新文本/[标志]' 文件
- 标志:
g:全局替换(默认仅替换每行首个匹配)p:打印替换后的行(需配合-n)- 数字:替换第N个匹配(例:
s/apple/orange/2替换每行第二个"apple")
# 将所有"apple"替换为"orange"并保存原文件备份
sed -i.bak 's/apple/orange/g' fruits.txt
2. 删除行(d 命令)
# 删除空行
sed '/^$/d' file.txt
# 删除注释行(以#开头)
sed '/^#/d' config.ini
# 删除第3行
sed '3d' log.txt
3. 插入与追加文本
- 插入(
i\):在指定行前添加 - 追加(
a\):在指定行后添加
# 在第2行前插入
sed '2i\插入内容' file.txt
# 在含"section"的行后追加
sed '/section/a\追加内容' config.ini
4. 打印文本(p 命令)
# 打印第5-10行
sed -n '5,10p' log.txt
# 打印含"ERROR"的行
sed -n '/ERROR/p' app.log
5. 行号处理(= 命令)
# 打印含"warning"的行号
sed -n '/warning/=' messages.log
🔧 四、高级技巧
1. 多命令执行
# 方式1:分号分隔
sed 's/a/b/; s/c/d/' file.txt
# 方式2:-e 选项
sed -e 's/a/b/' -e 's/c/d/' file.txt
2. 引用变量
# 双引号支持变量扩展
new="orange"; sed "s/apple/$new/g" file.txt
# 单引号需拼接变量
sed 's/apple/'"$new"'/g' file.txt
3. 正则表达式分组
使用 \(...\) 捕获内容,\1 引用分组:
# 提取IP地址(匹配inet后的内容)
ifconfig ens33 | sed -n 's/.*inet \(.*\) net.*/\1/p'
4. 多行处理
通过 N(读取下一行)、D(删除模式空间首行)等命令合并多行:
# 将空行分隔的记录合并为单行
sed '/./!{H;$!d}; x; s/\n/ /g' data.txt
🧩 五、实战案例
-
批量修改配置文件
# 替换所有.conf文件中的旧IP sed -i 's/192.168.1.1/192.168.1.2/g' /etc/*.conf ``` -
清理日志文件
# 删除3天前的日志(日期格式YYYY-MM-DD) three_days_ago=$(date -d "3 days ago" +%Y-%m-%d) sed -i "/^$three_days_ago/d" app.log -
提取HTML链接
sed -n 's/.*href="\([^"]*\)".*/\1/p' index.html -
备份并修改文件
# 修改前创建.bak备份 sed -i.bak 's/TMOUT=300/TMOUT=0/' /etc/profile
⚠️ 六、注意事项
- 备份文件:使用
-i.bak避免误操作丢失数据。 - 特殊字符转义:替换内容含
/时改用#或@作分隔符(例:s#/old#/new#g)。 - 性能优化:大文件处理时避免复杂正则,优先使用
awk或perl - 测试验证:正式执行前移除
-i测试输出,确认无误后再修改源文件。
Sed的精髓在于**“以行为单位的流式处理”**,结合正则表达式可高效解决90%的文本编辑需求。复杂场景(如JSON解析)建议结合
jq或Python工具