Skip to main content

Linux sed 命令是做什么用的?

· 3 min read

sed 是 Linux / macOS 终端下最常用的 流式文本批量处理工具,不用打开文件就能完成全局修改。

  1. 核心功能:逐行扫描文本,执行查找、替换、删除、插入等操作
  2. 典型场景:批量修改代码/配置文件、日志过滤、文本格式转换
  3. 语法模板:sed -i 's|原字符串|新字符串|g' 文件名,全程无交互
  4. 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 能做的事情非常多,我最常用的几个场景:

  1. 批量替换:比如整个项目里把某个旧域名换成新域名,把某个废弃的接口地址换成新的
  2. 批量删除:删除文件里所有的空行、所有的注释行、所有包含特定关键词的行
  3. 批量插入:给每一行的开头加个前缀,结尾加个后缀
  4. 日志分析:从几十兆的日志文件里过滤出包含错误信息的行,提取特定字段

踩坑提醒

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 是终端必备技能之一,学会了能省非常多重复劳动的时间。