sed默认自带,不加-i仅预览不修改文件;-i可原地替换,推荐用-i.bak备份;批量处理宜用grep+xargs防路径错误;替换含斜杠路径应换分隔符如s|old|new|g;大文件操作前须用grep验证正则精准性。

sed 不需要单独安装——它在几乎所有 Linux 发行版中默认自带,属于 GNU coreutils 套件的一部分。执行 sed --version 即可确认是否存在;若提示 command not found,才需安装(如 Debian/Ubuntu:apt install sed,CentOS/RHEL:dnf install sed 或 yum install sed)。
替换前必须加 -i 才会修改原文件
不加 -i 的 sed 's/old/new/g' file.txt 只是把结果输出到终端,原文件完全不变。这是新手最常踩的坑:以为执行了就替换了,结果一查还是老样子。
- 加
-i直接写回原文件:sed -i 's/foo/bar/g' config.conf - 更安全的做法是带备份后缀:
sed -i.bak 's/foo/bar/g' config.conf→ 会生成config.conf.bak - 注意:
-i在 macOS/BSD 上语法不同(需加空格和后缀),Linux 用户无需担心,但写跨平台脚本时要留意
批量处理多个文件时,通配符和 find + xargs 的区别
for file in *.conf; do sed -i 's/localhost/127.0.0.1/g' "$file"; done
适用于当前目录下文件名规则明确、数量不多(几百以内)的场景。但当文件数超 shell 参数限制(如上万),或路径含空格、换行时,for 循环容易出错或崩溃。
更鲁棒的方式是:
grep -l 'localhost' -r ./configs/ | xargs -d '\n' sed -i 's/localhost/127.0.0.1/g'-
grep -l 只输出匹配文件名,避免对无关文件误操作
- -d '\n' 显式指定分隔符,兼容含空格路径(GNU xargs 支持)
- 若系统较旧不支持 -d,改用 grep -Z | xargs -0(需 grep 和 xargs 都支持 null 分隔)
替换含斜杠的路径时,必须换分隔符
sed -i 's/\/var\/log/\/opt\/logs/g' script.sh 是错的——虽然能运行,但可读性差、易漏转义。正确做法是换分隔符:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 用竖线:
sed -i 's|/var/log|/opt/logs|g' script.sh - 用井号:
sed -i 's#/usr/bin#/opt/bin#g' env.sh - 用下划线:
sed -i 's_@#@#@#@#@#@#@#@#@#@0' config.json
注意:分隔符一旦更换,命令中所有该字符都不再需要转义,但也不能在 pattern 或 replacement 中混用未转义的相同字符(比如用 / 作分隔符时,replacement 里写 https:// 就得写成 https:\/\/)。
大文件或敏感配置替换前,务必先验证正则是否精准
sed 不会预判语义,s/timeout=30/timeout=60/g 可能误中 timeout=300 或注释行里的字符串。真实环境中建议:
- 先用
grep -n 'timeout=30' file.conf确认上下文 - 再用
sed 's/timeout=30/timeout=60/g' file.conf | head -20看效果 - 若涉及单词边界,改用扩展正则:
sed -E 's/\btimeout=30\b/timeout=60/g' file.conf(-E启用\b等元字符) - 涉及多行匹配(如替换一段被注释掉的 block)时,
sed能力有限,应考虑awk或perl
真正危险的不是命令不会跑,而是它太听话——你给它什么模式,它就机械地换什么,不管那是不是你心里想换的那部分。










