sed批量改ip需三步:先用grep精准定位含目标ip的配置文件,再用上下文限定替换避免误伤注释或url,最后带备份(-i.bak)批量处理并验证。

用 sed 批量改配置文件里的 IP,核心就三点:精准定位要改的文件、安全执行替换、避免误伤内容。不是简单写个 s/旧IP/新IP/g 就完事——IP 里有小数点、可能出现在注释或 URL 里、不同配置格式(如 YAML、INI、XML)对空格和引号敏感,一步错就全乱。
先找对文件,别改错地方
直接在所有文件上硬跑 sed 风险很高。推荐先用 grep 锁定真实含目标 IP 的配置文件:
-
grep -rl '192\.168\.1\.' /etc/ --include="*.conf" --include="*.yaml" --include="*.ini" 2>/dev/null—— 列出所有含该 IP 的指定后缀文件 - 如果不确定后缀,可加
| head -20预览,确认范围后再操作 - 注意
\.转义小数点,否则正则会匹配任意字符
替换时要防“连坐”,只动该改的行
IP 经常出现在注释、日志路径、甚至 URL 中。盲目全局替换可能把 http://192.168.1.100/api 或 # backup server: 192.168.1.200 也改掉。稳妥做法是限定上下文:
- 只改以
ip=开头的行:sed -i '/^ip=/s/192\.168\.1\./10\.0\.0\./g' file.conf - 只改冒号后的值(如
host: 192.168.1.5):sed -i '/^[[:space:]]*host:/s/192\.168\.1\./10\.0\.0\./g' *.yaml - 排除以
#开头的注释行:sed -i '/^[^#]/s/192\.168\.1\./10\.0\.0\./g' *.cfg
批量处理多个文件,带备份更安心
别跳过备份。生产环境必须用 -i.bak,而不是裸 -i:
- 改当前目录下所有
.conf文件:sed -i.bak 's/192\.168\.1\./10\.0\.0\./g' *.conf - 递归改子目录(推荐):
find /etc -type f \( -name "*.conf" -o -name "*.yaml" \) -exec sed -i.bak 's/192\.168\.1\./10\.0\.0\./g' {} + - 执行后检查备份:
ls *.conf.bak确认备份生成;对比改动:diff file.conf.bak file.conf
复杂场景:多个 IP 一起换,或只换某段
一次迁多台机器?或者只想改网段不碰主机位?
- 多个 IP 同步替换(用分号串接):
sed -i.bak -e 's/192\.168\.1\.10/10\.0\.0\.10/g' -e 's/192\.168\.1\.11/10\.0\.0\.11/g' *.conf - 只换前三个字节(保留最后一段):
sed -i.bak -r 's/192\.168\.1\.([0-9]+)/10\.0\.0\.\1/g' *.ini——\1引用捕获组,原主机号不变 - 用扩展正则(
-r)让写法更清爽,比如192\.168\.1\.可简写为192\.168\.1\.(点仍需转义),但+、?就不用再加反斜杠了











