批量处理文本的sed命令
一、命令介绍与原理
1.1 介绍
sed(Stream Editor)是一个强大的流式文本编辑器,专门用于对文本流进行非交互式处理。它按行读取输入,应用指定的编辑命令,然后输出结果。sed 是文本处理三剑客(grep、sed、awk)之一,以其高效和灵活性著称。
1.2 工作原理
- 流式处理:逐行读取输入,不将整个文件加载到内存
- 模式空间:当前处理的行存储在模式空间中
- 保持空间:提供临时存储区域用于复杂操作
- 命令执行:对模式空间中的文本应用编辑命令
- 自动输出:除非使用特定选项,否则每行处理后自动输出
1.3 核心特点
- 支持正则表达式
- 非交互式批量编辑
- 保持原文件不变(除非使用 -i 选项)
- 可以处理大文件
二、基本语法
sed [选项] '命令' 输入文件
常用选项
-n, --quiet, --silent # 禁止自动输出,只有明确指定的行才输出
-e 脚本, --expression=脚本 # 添加要执行的命令
-f 脚本文件, --file=脚本文件 # 从文件读取sed脚本
-i[SUFFIX], --in-place[=SUFFIX] # 直接修改文件(如果提供SUFFIX则备份)
-r, --regexp-extended # 使用扩展正则表达式
-E # 同 -r,使用扩展正则表达式
-l N, --line-length=N # 为l命令指定行长度
--posix # 禁用所有GNU扩展
-z, --null-data # 用NUL字符分隔行
基本命令语法
# 地址定位
数字 # 指定行号
$ # 最后一行
/正则表达式/ # 匹配模式的行
地址1,地址2 # 地址范围
# 常用命令
s/原模式/替换模式/标志 # 替换
p # 打印
d # 删除
a\文本 # 在指定行后追加文本
i\文本 # 在指定行前插入文本
c\文本 # 替换整行
y/原字符集/新字符集/ # 字符转换
三、经典使用场景
3.1 文本替换
# 基本替换输出,并不直接修改文件(只替换每行第一个匹配)
sed 's/old/new/' file.txt
# 全局替换(替换所有匹配)
sed 's/old/new/g' file.txt
# 替换第2次出现的匹配
sed 's/old/new/2' file.txt
# 替换第2行到第4行的匹配
sed '2,4s/old/new/g' file.txt
# 只替换包含"pattern"的行
sed '/pattern/s/old/new/g' file.txt
# 添加 -i 选项,则直接修改文件
sed -i 's/old/new/' file.txt
3.2 删除操作
# 删除第3行输出,并不真正删除
sed '3d' file.txt
# 删除第2-5行
sed '2,5d' file.txt
# 删除空行
sed '/^$/d' file.txt
# 删除以#开头的注释行
sed '/^#/d' file.txt
# 删除包含"debug"的行
sed '/debug/d' file.txt
# 添加 -i 选项,则直接删除文件内容
# 删除文件第3行
sed -i '3d' file.txt
3.3 打印特定内容
# 打印第5-10行
sed -n '5,10p' file.txt
# 打印包含"error"的行
sed -n '/error/p' file.txt
# 打印从包含"start"到包含"end"的行
sed -n '/start/,/end/p' file.txt
# 打印文件除第5-10行外的所有行
sed '5,10d' file.txt
3.4 插入和追加
# 在第3行前插入文本输出,并非真正插入
sed '3i\插入的文本' file.txt
# 在第3行后追加文本
sed '3a\追加的文本' file.txt
# 在文件开头插入
sed '1i\文件头' file.txt
# 在文件末尾追加
sed '$a\文件尾' file.txt
# 在匹配行后追加
sed '/pattern/a\追加文本' file.txt
# 在第3行前插入文本
sed -i '3i\hello word' file.txt
四、与其他工具命令结合使用
4.1 与 grep 结合
# 先grep过滤,再sed处理
grep "error" file.txt | sed 's/error/ERROR/g'
# 在grep结果中进行替换
sed -n '/error/p' file.txt | sed 's/.*ERROR: //'
# 组合搜索和替换
grep -l "old_text" *.txt | xargs sed -i 's/old_text/new_text/g'
4.2 与 awk 结合
# awk处理列,sed处理内容
awk '{print $1}' data.txt | sed 's/^/前缀_/'
# 复杂数据处理管道
cat logfile | awk '/ERROR/ {print $0}' | sed 's/ERROR/CRITICAL/g'
4.3 与 find 结合进行批量处理
# 批量修改多个文件
find . -name "*.txt" -exec sed -i 's/old/new/g' {} \;
# 使用xargs提高效率
find . -name "*.conf" -print0 | xargs -0 sed -i 's/
#Port
22/Port 2222/'
# 备份原文件后修改
find /etc -name "*.conf" -exec sed -i.bak 's/old/new/g' {} \;
4.4 在 Shell 脚本中应用
#!/bin/bash
# 配置文件管理脚本
manage_config() {
local config_file="$1"
local action="$2"
case "$action" in
"comment")
# 注释掉指定配置
sed -i '/^Listen/s/^/#/' "$config_file"
;;
"uncomment")
# 取消注释
sed -i '/^
#Listen
/s/^#//' "$config_file"
;;
"update")
# 更新配置值
sed -i 's/^Port.*/Port 2222/' "$config_file"
;;
*)
echo "未知操作"
;;
esac
}
五、进阶应用场景
5.1 复杂文本转换
# 转换日期格式 (MM-DD-YYYY -> YYYY-MM-DD)
sed -E 's/([0-9]{2})-([0-9]{2})-([0-9]{4})/\3-\1-\2/g' dates.txt
# 转换大小写
echo "Hello World" | sed 's/.*/\L&/' # 转为小写
echo "hello world" | sed 's/.*/\U&/' # 转为大写
# 提取XML/HTML标签内容
sed -n 's/.*<title>\(.*\)<\/title>.*/\1/p' webpage.html
5.2 多行文本处理
# 合并连续空行为单个空行
sed '/^$/{N;/^\n$/D}' file.txt
# 在多行模式中搜索和替换
sed ':a;N;$!ba;s/旧文本\n跨行/新文本\n跨行/g' file.txt
# 在匹配模式前后插入多行文本
sed '/pattern/{
a\
第一行追加文本\
第二行追加文本
}' file.txt
5.3 日志分析和处理
#!/bin/bash
# 日志分析工具
log_analyzer() {
local log_file="$1" # 执行脚本时记得要添加分析日志
echo "=== 错误分析 ==="
# 提取错误信息并统计
sed -n 's/.*\(ERROR\|FATAL\).*/\1/p' "$log_file" | sort | uniq -c
echo "=== 时间范围提取 ==="
# 提取特定时间段的日志
sed -n '/2025-11-11 10:00:00/,/2025-11-12 11:00:00/p' "$log_file"
echo "=== IP地址提取 ==="
# 提取所有IP地址
sed -n 's/.*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p' "$log_file" | sort -u
}
# 实时日志监控和处理
monitor_logs() {
tail -f /var/log/apache2/access.log | \
sed -u 's/\(.*\) \([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\) \(.*\)/IP: \2 | \1/'
}
5.4 与其他命令的对比
# sed vs awk
sed 's/old/new/g' file # 简单的文本替换
awk '{gsub(/old/, "new"); print}' file # 更复杂的文本处理
# sed vs perl
sed -E 's/pattern/replacement/g' file # 基本的正则替换
perl -pe 's/pattern/replacement/g' file # 更强大的正则引擎
# sed vs tr
sed 'y/abc/ABC/' file# 字符对字符转换
tr 'abc''ABC' < file # 专门的字符转换工具
六、总结
通过深入掌握 sed 命令,可以构建强大的文本处理流水线,无论是简单的字符串替换还是复杂的多行文本转换,sed 都能提供高效可靠的解决方案。虽然学习曲线较陡,但一旦掌握,它将成为日常工作中不可或缺的文本处理利器。

浙公网安备 33010602011771号