如何使用sed在bash脚本中替换/opt/data/hosts文件buildservers分组的IP地址
Bash脚本替换Ansible hosts文件指定段IP的实现方案
原脚本存在的问题
- 函数
update_host定义在调用之后,执行时会报命令不存在的错误 - 原sed命令仅匹配
[buildservers]行的下一行做替换,只能修改第一个IP,无法批量删除同段所有旧IP
修正后的完整脚本
#!/bin/bash hosts=/opt/data/hosts # 替换[buildservers]段下的所有IP update_host() { new_ip1="$1" new_ip2="$2" new_ip3="$3" # 双引号包裹sed表达式保证变量可以正常展开 sed -i "/^\[buildservers\]$/{ n # 跳转到[buildservers]的下一行(第一个旧IP行) :loop # 定义循环标记 /^\[/!{ # 匹配非段开头的行(即当前还是IP列表行) d # 删除该行 b loop # 回到循环继续处理下一行 } # 在[buildservers:vars]行之前插入新IP i\\ $new_ip1\\ $new_ip2\\ $new_ip3 }" "$hosts" } if [ -f "$hosts" ] ; then echo "Hosts file exists" # 传入你需要替换的三个新IP即可 update_host 10.10.10.11 10.10.10.12 10.10.10.13 else echo "Hosts: No such file" exit 0 fi
验证说明
首次测试可以先去掉sed命令的-i参数,直接打印输出结果,确认替换逻辑符合预期后再加-i参数修改原文件。
内容的提问来源于stack exchange,提问作者charan
相关产品推荐
相关产品推荐

