如何动态替换文件中http://与:80之间的内容
问题需求
需要动态替换配置文件中http://与:80之间的内容为获取到的IP地址。原有脚本通过固定匹配localhost进行替换,但该位置的内容可能发生变化(比如示例中已出现拼写错误locahost),因此需要改为精准替换这两个字符串之间的任意内容。
需替换的配置行示例:
"UIApiPath": "http://localhost:80/uisvc/v1/api", "serviceApiPath": "http://localhost:80/servicesvc/v1/api", "DBApiPath": "http://locahost:80/DBsvc/v1/api"
原有脚本问题
现有脚本通过sed直接替换localhost,但如果该位置不是localhost(比如拼写错误或其他域名/IP),替换就会失效:
#!/bin/bash DEPLOYMENT_NAME=$1 # 从deployment对象获取pod名称 GETTING_POD_NAME=$(kubectl describe deploy $1 | grep 'NewReplicaSet:' | awk '{print $2}') # 从pod描述获取IP地址 echo '' GETTING_IP_ADDRESS=$(kubectl describe pod $GETTING_POD_NAME | sed -n '4p' | awk '{print $2}') # 提取正确的IP地址(去掉前缀) SERVER_IP=${GETTING_IP_ADDRESS#*/} echo $SERVER_IP # 应用配置文件路径 APP_CONFIGMAP_FILE_PATH=deployment/java-apps/app-configmap.yaml # 在配置文件中替换IP地址 sed -i "s/localhost/$SERVER_IP/g" $APP_CONFIGMAP_FILE_PATH
修改后的脚本
修改核心是调整sed的正则匹配规则,精准定位http://到:80之间的内容并替换:
#!/bin/bash DEPLOYMENT_NAME=$1 # 从deployment对象获取pod名称 GETTING_POD_NAME=$(kubectl describe deploy $1 | grep 'NewReplicaSet:' | awk '{print $2}') # 从pod描述获取IP地址 echo '' GETTING_IP_ADDRESS=$(kubectl describe pod $GETTING_POD_NAME | sed -n '4p' | awk '{print $2}') # 提取正确的IP地址(去掉前缀) SERVER_IP=${GETTING_IP_ADDRESS#*/} echo $SERVER_IP # 应用配置文件路径 APP_CONFIGMAP_FILE_PATH=deployment/java-apps/app-configmap.yaml # 精准替换http://与:80之间的内容为目标IP sed -i "s|http://[^:]*:80|http://${SERVER_IP}:80|g" $APP_CONFIGMAP_FILE_PATH
修改说明
- 使用
|作为sed替换的分隔符,避免和URL中的/冲突 - 正则表达式
[^:]*匹配任意非冒号的字符,精准覆盖http://到:80之间的所有内容(不管原来是localhost、拼写错误的locahost还是其他值) - 全局替换标记
g确保所有符合规则的行都被修改
内容的提问来源于stack exchange,提问作者curiousgeek
相关产品推荐
相关产品推荐

