1. Sed 简介与基本概念
1.1 什么是 Sed?
Sed(Stream Editor)是Unix/Linux系统中一个强大的非交互式文本处理工具。我第一次接触sed是在处理服务器日志时,需要批量替换上千个文件中的IP地址格式。与vim等交互式编辑器不同,sed通过命令行参数或脚本文件接受编辑指令,特别适合自动化文本处理场景。
sed的核心特点是"流式处理"——它逐行读取输入(可以是文件或管道数据),在内存中按指定规则处理后输出结果。这种工作模式决定了它的两大优势:一是处理大文件时内存占用极少(不像某些编辑器需要加载整个文件);二是能完美嵌入Shell管道,与其他命令(如grep、awk)协作完成复杂任务。
提示:sed默认不会修改原文件,所有操作结果都输出到标准输出。需要原地修改文件时,必须使用-i选项(后文会详细说明)。
1.2 工作流程
理解sed的工作机制对编写高效命令至关重要。它的处理流程可以拆解为以下步骤:
- 读取:从输入流中读取一行文本,移除末尾的换行符
- 存储:将当前行存入"模式空间"(Pattern Space)——这是sed的核心工作区
- 执行:按顺序应用所有编辑命令(如替换、删除等)
- 输出:除非被明确抑制(-n选项),否则自动打印模式空间内容
- 清空:删除模式空间内容,准备处理下一行
这个循环会持续到输入结束。看似简单,但配合后文将介绍的保持空间(Hold Space)和多行处理命令,能实现极其复杂的文本转换。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Sed 命令行选项
sed的命令行选项是控制其行为的开关。以下是实际工作中最常用的几个:
| 选项 | 作用说明 | 典型使用场景 |
|---|---|---|
-n |
关闭自动打印,常与p命令配合使用 |
提取特定行:sed -n '10,20p' log.txt |
-e |
指定多个编辑命令 | sed -e 's/foo/bar/' -e '/baz/d' |
-f |
从文件读取sed脚本 | 复杂操作:sed -f script.sed data |
-i[SUFFIX] |
直接修改文件内容(SUFFIX为备份扩展名) | 批量替换:sed -i.bak 's/old/new/g' * |
-r/-E |
启用扩展正则表达式(Linux用-r,Mac用-E) | 复杂匹配:sed -r 's/(ab)+/X/g' |
避坑指南:使用
-i时务必小心——我有次误操作把整个项目的import语句都替换错了。建议:
- 先不加
-i测试命令效果- 使用
-i.bak保留备份- 用版本控制系统(如git)管理重要文件
3. 地址定位
3.1 行号定位
sed允许精确指定操作的行范围,这是其区别于简单替换工具的核心能力:
bash复制# 操作单行
sed '5s/error/ERROR/' app.log # 仅修改第5行
# 操作连续行范围
sed '10,20d' data.txt # 删除10到20行
# 特殊位置标记
sed '$a\END OF FILE' report.txt # 在最后一行后追加内容($表示末行)
# 步进选择
sed '1~2s/^/# /' config.conf # 注释所有奇数行(从第1行开始每2行)
3.2 模式定位
更强大的方式是用正则表达式定位:
bash复制# 基本模式匹配
sed
