Linux 文本处理“三剑客”:sed命令完全指南
Linux 文本处理“三剑客”:sed命令完全指南
Linux 文本处理“三剑客”里,sed 常被视作批处理利器。面对日志、配置、代码批量重写,个人觉得 sed 的流式思路能让重复操作彻底自动化,下文按照“概念 → 命令 → 参数 → 场景 → 最佳实践”展开。
核心概念
流式编辑器的思维方式
sed 逐行读入文本到 Pattern Space,按脚本匹配后输出或丢弃,原文件默认不被改写。
Hold Space 负责暂存上下文,比如跨多行的匹配;命令循环确保“读取 → 匹配 → 执行 → 输出”不断迭代。
笔者认为理解这种“流经内存而非整体加载”的模式,是写出高性能脚本的前提。
最常用的命令组合
基础命令
打印指定行
sed -n ‘2p’ file.txt
删除匹配行
sed ‘/error/d’ file.txt
在第2行后追加
sed ‘2a 新增行’ file.txt
在第1行前插入
sed ‘1i Header’ file.txt
替换整行
sed ‘3c Replacement’ file.txt
最常用:替换文本
sed ‘s/old/new/’ file.txt
记忆口诀 p/d/a/i/c/s 对应 Print、Delete、Append、Insert、Change、Substitute,能覆盖 80% 的日常改写需求。
控制行为的关键参数
关键参数
-n 关闭默认输出,配合 p 精准打印结果。
-e 串联多条命令,避免多次读取文件。
-i[.bak] 原地修改并可选择生成备份,生产场景应先试跑再落盘。
-E(或 -r)启用扩展正则,处理复杂模式更省心。 替换标志 g/p/I/w 分别代表全局、打印匹配行、忽略大小写、写入文件,可组合使用。在管控日志时常用 -n + p 精选关键信息,再通过 w 输出给后续任务。
文本替换:从简单到进阶
文本替换
每行仅替换第一个匹配
sed ‘s/old/new/’ file.txt
全量替换
sed ‘s/old/new/g’ file.txt
忽略大小写
sed ‘s/old/new/I’ file.txt
反向引用:给行内容加方括号
sed ‘s/^(.*)$/[\1]/’ file.txt
指定行替换:只动第4行
sed ‘4s/old/new/’ file.txt
清理首尾空白
sed ‘s/1//’ file.txt
sed 's/[ \t]$//’ file.txt
通过地址(行号、正则)+ s///flags 的组合,复杂重构也能拆解为多步替换。
文本增删:精准操控行级内容
文本增删
追加、插入、更换整行
sed ‘2a TODO’ file.txt
sed ‘1i Header’ file.txt
sed ‘3c New line’ file.txt
批量删除
sed ‘1,4d’ file.txt # 删除第1-4行
sed ‘/error/d’ file.txt # 删除包含 error 的行
sed ‘/^KaTeX parse error: Expected 'EOF', got '#' at position 19: … file.txt #̲ 删除空行
sed 'd’ file.txt # 删除最后一行
组合地址范围与命令,可精细裁剪配置文件、批量修正脚本段落。
高级技巧与项目实践
高级技巧
sed -e ‘cmd1’ -e ‘cmd2’ file 将串行逻辑合并,避免多次 IO。
sed -f script.sed file 维护独立脚本文件,利于版本控制与复用。
sed ‘/start/,/end/d’ 等范围命令可快速清理配置块。
管道组合:cat file | sed ‘s/old/new/’ | grep pattern 提升筛选效率。
批量处理:find . -name ‘*.log’ -exec sed -i ‘’ ‘s/old/new/g’ {} + 统一替换日志(macOS 留空后缀即可)。
我认为最佳实践是“先试跑、后写盘”:先用 -n、p、w 验证,确认无误再添加 -i,同时保留 .bak 回滚路径。
与 grep、awk 的协同
grep 负责快速筛选,sed 擅长在筛选结果上做修改;二者串联能实现“查找 + 改写”一体化。
awk 更适合基于列的数据处理;当需要字段级计算后再回写文本时,可先 awk 处理结构化信息,再交给 sed 修饰格式。
在脚本流水线中,合理安排工具顺序,可减少正则重复匹配、降低整体耗时。
结语
sed 的价值在于把“手工重复”变成“脚本流水”。理解流式机制、熟悉命令地址、养成先验证后写盘的习惯,就能在日志治理、配置批处理、CI 自动化里游刃有余。
\t ↩︎
