linux运维中sed流式编辑核心是逐行处理与模式空间机制,-i原地替换须带.bak备份;常用命令包括全局替换、忽略大小写、地址范围操作及多命令串联等。

Linux 运维中用 sed 做流式编辑和原地替换,核心在于理解“逐行处理”和“模式空间”机制,再结合 -i 选项安全落地。关键不是背命令,而是清楚每一步数据流向:读一行 → 放进模式空间 → 执行命令 → 输出(或不输出)→ 清空 → 读下一行。
流式编辑:不改原文件,只处理输出流
这是最常用、最安全的用法,适合预览效果、管道处理或配合其他命令使用。
-
基础替换(默认只换每行第一个匹配):
sed 's/foo/bar/' file.txt -
全局替换(一行多个匹配全换):
sed 's/foo/bar/g' file.txt -
忽略大小写:
sed 's/foo/bar/gi' file.txt(GNU sed 支持) -
仅打印被修改的行:加
-n抑制默认输出,再用p显式打印成功替换的行:sed -n 's/error/warning/gp' app.log -
处理多行匹配(如注释块):用地址范围限定,例如删除第5到10行:
sed '5,10d' config.conf
原地替换(-i):直接修改文件,务必带备份
-i 会让 sed 覆盖原文件,不可逆。生产环境必须用 -i.bak 先生成备份,哪怕只是临时应急。
-
安全写法(推荐):
sed -i.bak 's/Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf→ 自动生成httpd.conf.bak -
不带备份的写法(禁止在生产环境直接用):
sed -i 's/old/new/g' file -
替换整行内容(比如固定位置配置项):
sed -i.bak '3s/.*/bind_addr = "127.0.0.1"/' /etc/myapp/conf.ini→ 第3行全部替换成新内容 -
删除空行或注释行再保存:
sed -i.bak '/^#/d;/^$/d' script.sh
复杂操作:用 -e 或脚本分步处理
单条命令不够时,避免嵌套引号混乱,优先用 -e 拆开,或写成独立脚本。
-
多个替换串联:
sed -i.bak -e 's/alpha/beta/g' -e 's/gamma/delta/g' data.txt -
插入+替换组合:
sed -i.bak -e '/^# End of config$/i\new_option = true' -e 's/timeout=30/timeout=60/' config.cfg -
从文件读命令(适合长期复用逻辑):
sed -i.bak -f fix_rules.sed hosts,其中fix_rules.sed内容为:
s/127\.0\.0\.1/127.0.0.1 localhost/g
/^::1$/d
实用技巧与避坑提醒
运维现场容易栽跟头的地方,往往不在语法,而在细节。
-
斜杠冲突?换分隔符:替换路径时避免大量转义,改用
#或|作分隔符:sed 's#/usr/bin#/opt/bin#g' -
正则更简洁?加 -r(或 -E):
sed -r 's/(error|warn): ([0-9]+)/[CRITICAL] \2/g'→ 支持+、?、|等,不用写\+ -
匹配含换行的内容?sed 不擅长:它按行处理,跨行匹配要用
awk或perl。别硬扛。 -
确认是否生效?先去掉 -i 预览:所有
-i操作前,务必先跑一遍无-i的版本,肉眼核对输出是否符合预期。











