首页/系统/Linux 运维命令速查/场景:多文件批量替换文本
文本处理77 条

场景:多文件批量替换文本

站点改域名、批量改配置的经典组合:grep -rl 先列出命中文件 → sed -i.bak 替换留档 → 再 grep 复核;范围永远先小后大。

Linux 运维命令速查系统更新于 2026-10-13

这条路径解决什么

站点换域名、批量改配置这类需求,稳妥公式是四步:grep -rl 先列出确实命中的文件清单、统计每个文件的命中次数、在清单范围内用 sed -i 替换并留备份、最后再 grep 复核。范围永远先小后大,先在一个文件或一个目录上验证规则,再铺开到全站。

基本信息

适用场景跨多个文件的字符串替换
核心组合grep -rl 定位、sed -i 替换、grep 复核
安全选项sed -i.bak 为每个文件保留备份;-Z 与 -0 处理含空格的文件名
范围控制--include 限定扩展名、--exclude-dir 排除备份与缓存目录
执行纪律先输出清单与命中次数,再执行替换

典型使用场景

  • 站点换域名:把页面与配置里的旧域名批量改成新域名
  • 协议升级:把 http:// 统一替换为 https://
  • 端口调整:配置里的旧端口批量替换
  • 路径迁移:站点根目录变化后更新引用路径
  • 敏感信息清理:把硬编码的测试账号从示例文件里移除

建议流程

建议流程
grep -rl 'old_domain.com' /www/wwwroot/site --include='*.html' | tee /tmp/hit.txt
grep -c 'old_domain.com' $(cat /tmp/hit.txt) | head          # 每个文件的命中次数
xargs -a /tmp/hit.txt sed -i.bak 's/old_domain\.com/new_domain.com/g'
grep -rl 'old_domain.com' /www/wwwroot/site --include='*.html' | wc -l   # 复核:应为 0
grep -rc 'new_domain.com' /www/wwwroot/site --include='*.html' | head

文件名含空格时的稳妥写法

文件名含空格时的稳妥写法
grep -rlZ 'old_domain.com' /www/wwwroot/site --include='*.html' \
  | xargs -0 sed -i.bak 's/old_domain\.com/new_domain.com/g'

替换前检查项

检查项方法为什么
命中清单grep -rl 输出并存档确认范围可控,便于事后复原
命中次数grep -c 逐文件统计避免一个文件里误替换大量无关内容
正则元字符域名里的点要写成 \\.否则会匹配任意字符,误伤别的域名
是否含二进制grep -I 排除二进制文件二进制被替换会直接损坏
备份范围排除 *.bak 与缓存目录免得把备份也一起改掉、失去回退能力
sed -i.bak 会为每个被改动的文件留下 .bak 备份:确认无误后再统一清理,清理前先 find 列出清单核对数量,避免误删还在用的文件或把备份清掉了却发现问题。替换完成后一定要用 grep 复核剩余命中数。
替换表达式的写法决定风险:sed 默认把模式当基本正则,域名里的点必须转义成 \\.,否则 old_domainXcom 这类意外字符串也会被命中。写完后先用 sed -n 's/旧/新/p' 输出会改动的行,人工扫一眼再落地。
范围要提前收紧:用 --include 限定扩展名,用 --exclude-dir 排除 node_modules、.git、缓存与备份目录。范围越小越容易复核,也不会顺手改掉自动生成的文件——那些文件下次构建还会被覆盖,改了等于白改。

易错点

  • 替换串里的正则元字符要转义(域名里的点写成 \\.),否则会命中本不该改的内容
  • 文件列表含空格或特殊字符时管道要用 grep -rlZ 配 xargs -0,普通 xargs 会把路径拆断
  • grep 会连备份文件一起命中,替换时把 *.bak 也改掉,等于同时失去回退依据
  • sed -i 在不同平台上语法不同:GNU sed 用 -i 后缀,BSD 与 macOS 需要 -i '',跨平台脚本要区分
  • 替换后不做复核,遗漏文件或替换错误往往在页面出错时才被发现

数据来源与参考

  • man 1 sed(GNU sed 手册)
  • man 1 grep(GNU grep 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌