sed 流编辑¶
sed 逐行读取输入,根据脚本执行替换、选择、删除、插入等操作,默认把处理后的内容输出到 stdout。先预览输出,再决定是否原地修改文件。
替换¶
sed 's/old/new/' file # 每行只替换第一个
sed 's/old/new/g' file # 每行全部替换
sed 's|/opt/app|/data/app|g' file # 路径中用其他分隔符更清楚
sed 's/error/ERROR/2' file # 每行第 2 个匹配
& 代表完整匹配内容:
捕获组用于重排:
选取和删除¶
sed -n '1,20p' file
sed -n '/ERROR/p' app.log
sed -n '/BEGIN/,/END/p' file
sed '1d' file
sed '/^[[:space:]]*#/d' file
sed '/^[[:space:]]*$/d' file
-n 关闭默认打印,配合 p 只输出指定内容。忘记 -n 会让匹配行被额外打印一次。
按地址修改¶
sed '/^server {/,/^}/ s/listen 80;/listen 8080;/' nginx.conf
sed '10,20s/DEBUG/INFO/g' app.conf
sed '/production/!s/enabled=false/enabled=true/' app.conf
地址可以是行号、正则或范围。复杂嵌套配置(YAML/JSON/XML)不适合靠 sed 猜结构,应使用 yq、jq 或对应解析器。
原地修改与备份¶
GNU/Linux:
BSD/macOS:
无备份原地修改在 GNU 与 BSD 的写法也不同。自动化中优先显式生成备份并验证:
sed 's/^PORT=.*/PORT=8080/' app.env > app.env.new
diff -u app.env app.env.new
mv app.env.new app.env
sed -i 通常通过临时文件再重命名,可能影响符号链接、硬链接、权限扩展属性或其他进程持有的文件描述符。系统配置修改后还必须运行服务自身的语法检查。
插入、追加与多条命令¶
插入语法在不同 sed 实现上细节不同,跨平台脚本要在目标系统验证。较长 sed 程序可写入文件:
变量和转义¶
双引号允许 Shell 展开变量,但变量中的 &、反斜杠、分隔符或正则字符仍会改变 sed 语义。处理不可信输入或任意路径时,不要简单拼接成 sed 脚本。
运维示例¶
# 去除注释与空行,用于阅读有效配置
sed -E '/^[[:space:]]*(#|$)/d' app.conf
# 提取两个标记之间的日志
sed -n '/request_id=abc/,/request completed/p' app.log
# 给输出统一去掉 ANSI 颜色码(GNU/BSD 表达式需现场验证)
sed -E 's/\x1B\[[0-9;]*[[:alpha:]]//g'
官方参考:GNU sed manual。