Linux sed 命令是做什么用的?
· 3 min read
sed 是 Linux / macOS 终端下最常用的 流式文本批量处理工具,不用打开文件就能完成全局修改。
- 核心功能:逐行扫描文本,执行查找、替换、删除、插入等操作
- 典型场景:批量修改代码/配置文件、日志过滤、文本格式转换
- 语法模板:
sed -i 's|原字符串|新字符串|g' 文件名, 全程无交互 - Mac 注意:必须加空参数
'',否则直接报错
什么是 sed?
sed 全称 Stream Editor(流编辑器),是 Unix 系系统自带的文本处理神器。说白了就是不用你打开文件,一行命令就能完成批量修改,比手动编辑效率高几个量级。
我日常写代码、改配置的时候,凡是要全局替换内容的场景,第一个想到的就是 sed。比如最近我要把项目里所有的 clean-code 关键词替换成新的 ID,直接一行命令搞定:
sed -i '' 's|clean-code|lp6nDX|g' /Users/xxx/Projects/mysite/docs/readings/ToolOps/clean-code.md
常用参数解释
上面的命令看起来复杂,拆解开其实很简单:
-i:直接修改原文件,而不是把结果输出到终端(默认是只打印不修改)'':macOS 特有的必填参数,Linux 下可以省略。作用是指定备份文件的后缀, 填''就是不备份s|原字符串|新字符串|g:这是替换操作的核心语法:s:表示执行替换(substitute)操作|:分隔符,可以换成/、#等任意字符,只要不跟你要替换的内容冲突就行g:全局替换,也就是替换每行里所有匹配的内容,不加的话只换每行第一个匹配项
常见使用场景
sed 能做的事情非常多,我最常用的几个场景:
- 批量替换:比如整个项目里把某个旧域名换成新域名,把某个废弃的接口地址换成新的
- 批量删除:删除文件里所有的空行、所有的注释行、所有包含特定关键词的行
- 批量插入:给每一行的开头加个前缀,结尾加个后缀
- 日志分析:从几十兆的日志文件里过滤出包含错误信息的行,提取特定字段
踩坑提醒
macOS 用户一定要注意:
Mac 自带的 sed 版本和 Linux 下的 GNU sed 不一样,-i 参数后面必须加一个空的 '',否则会报类似 sed: 1: "file.txt": undefined label 'ile.txt' 的错误。
如果你想修改前先备份原文件,可以 把 '' 换成备份后缀,比如:
sed -i '.bak' 's|clean-code|lp6nDX|g' file.md
执行完会自动生成 file.md.bak 备份文件,改坏了也能恢复。
小技巧
如果你不确定替换的结果对不对,可以先不加 -i 参数,sed 会把修改后的内容打印到终端,你确认没问题了再加 -i 真正修改文件:
# 先预览修改结果
sed 's|clean-code|lp6nDX|g' file.md
# 确认没问题再执行修改
sed -i '' 's|clean-code|lp6nDX|g' file.md
总体来说 sed 是终端必备技能之一,学会了能省非常多重复劳动的时间。