这条路径解决什么
站点换域名、批量改配置这类需求,稳妥公式是四步: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、缓存与备份目录。范围越小越容易复核,也不会顺手改掉自动生成的文件——那些文件下次构建还会被覆盖,改了等于白改。