linux sed:功能强大的流式文本处理器
sed(Stream Editor)是Linux中强大的流式文本处理器,它以非交互方式逐行处理文本,通过简洁的命令实现查找、替换、删除、插入等操作,是自动化脚本和高效文本处理的利器。
一、核心概念与基础语法
基本命令格式:
sed [选项] '命令' 输入文件
常用选项:
-n:禁止默认输出(常与p命令配合)-i:直接修改源文件(⚠️危险操作!建议先测试)-e:执行多条命令(如sed -e 's/foo/bar/' -e '/baz/d' file)-r:启用扩展正则表达式(简化转义)
基础命令结构:
sed 's/查找模式/替换内容/标志' filename # 替换操作
sed '行号命令' filename # 指定行操作
sed '/模式/命令' filename # 模式匹配操作
二、高频使用场景与示例
1. 文本替换(最常用)
# 替换每行首个"apple"为"orange"
sed 's/apple/orange/' fruits.txt # 替换所有"error"为"ERROR"(全局替换)
sed 's/error/ERROR/g' logfile.log# 删除所有空行
sed '/^$/d' config.conf
2. 行范围操作
# 删除第5-10行
sed '5,10d' data.txt# 在第3行后插入文本
sed '3a\插入的内容' file# 替换第100行到文件末尾的"old"为"new"
sed '100,$s/old/new/' largefile
3. 模式匹配操作
# 删除包含"debug"的行
sed '/debug/d' code.py# 对以"2023-"开头的行执行替换
sed '/^2023-/s/ /_/g' dates.log
4. 引用匹配内容(& 和 \1)
# 为所有数字添加括号:123 → [123]
sed 's/[0-9]\+/[&]/g' text.txt# 调换字段顺序:John,Doe → Doe,John
sed 's/\(.*\),\(.*\)/\2,\1/' names.csv
5. 文件原地修改(谨慎使用!)
# 替换并备份原文件(生成file.bak)
sed -i.bak 's/old/new/g' file# 直接修改无备份(确保命令正确!)
sed -i 's/path\/to/opt\/new_path/' config.cfg
三、经典应用场景
日志清洗
# 提取时间戳和错误码:日志行 "2023-08-16 ERROR [code:500]"sed -n 's/.*\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\) .*\(ERROR\).*code:\([0-9]\+\).*/\1 \2 \3/p' app.log
配置文件批量更新
# 将所有"http://"替换为"https://"sed -i 's|http://|https://|g' /etc/nginx/conf.d/*.conf
数据格式转换
# CSV转TSV(逗号→制表符)sed 's/,/\t/g' data.csv > data.tsv
代码注释/取消注释
# 注释Python的print语句sed '/print/s/^/# /' script.py# 取消以#开头的注释sed 's/^# //' config.template
四、sed vs awk:如何选择?
| 特性 | sed | awk |
|---|---|---|
| 核心能力 | 基于行的流编辑 | 文本处理+编程语言 |
| 复杂度 | 简单替换/删除 | 支持变量、条件、循环等 |
| 列处理 | 弱(需正则捕获) | 强(自动分割字段 $1,$2...) |
| 适用场景 | 简单替换、行过滤、批量编辑 | 复杂报表、数据统计、字段运算 |
经验法则:
用
sed处理行级替换/删除用
awk处理列数据计算或报表生成
五、高效学习路径
掌握核心命令:
s(替换),d(删除),p(打印),a/i(插入)理解正则表达式:
^ $ . * [ ] \( \) \|练习范围操作:行号(
10,20)、模式(/start/,/end/)组合命令:
sed -e 'command1' -e 'command2'先测试再写入:永远先用不带
-i的命令测试输出!
💡 Pro Tip:复杂操作可保存为脚本文件:
sed -f edit_script.sed input.txt
结语
sed以其高效流处理和简洁语法成为Linux文本处理的基石。掌握它,你将拥有批量处理日志、配置、代码的自动化能力。从简单替换开始,逐步探索正则与范围操作,很快你就能在终端中优雅地驯服海量文本数据。
附:速查表
s/old/new/g # 全局替换
/pattern/d # 删除匹配行
3,7s/foo/bar/ # 替换3-7行的foo
1i\text # 在第1行前插入
$a\text # 在最后一行后插入
y/abc/ABC/ # 字符转换(a→A, b→B)
q # 处理到第5行退出:sed '5q' file
