You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:24:01