如何用Shell解析列表并更新多份YAML配置文件
解决方案:解析文本并批量更新YAML中的Ingress路径字段
要实现需求,不建议用纯shell工具(如cut、sed)直接修改YAML(YAML结构敏感,纯文本处理易出错),推荐使用专门的YAML处理工具yq配合shell脚本完成。以下是具体步骤:
1. 准备工作
安装yq(推荐v4版本,语法更直观):
- Debian/Ubuntu系统:
sudo apt install yq - macOS系统:
brew install yq - 其他系统可自行编译安装对应版本
2. 编写批量处理脚本
创建名为update_ingress_paths.sh的脚本,内容如下:
#!/bin/bash # 输入文本文件路径(可根据实际修改) INPUT_FILE="paths.txt" # 逐行解析文本文件 while IFS='|' read -r service auth_path; do # 清理服务名、auth、路径的前后空格 service=$(echo "$service" | xargs) auth=$(echo "$auth_path" | awk '{print $1}' | xargs) path=$(echo "$auth_path" | awk '{print substr($0, index($0,$2))}' | xargs) # 对应服务的YAML文件 yaml_file="${service}.yaml" # 跳过不存在的YAML文件 [ ! -f "$yaml_file" ] && echo "警告:$yaml_file 不存在,跳过" && continue # 用yq更新YAML:找到对应auth的实例,将路径追加到path数组 yq eval ".ingress.instances[] |= (select(.auth == \"$auth\") .path += [\"$path\"])" -i "$yaml_file" done < "$INPUT_FILE"
3. 调整YAML文件格式
确保服务YAML文件中的path字段为数组类型(否则无法追加多个路径),可将原有占位符替换为空数组:
ingress: instances: - auth: a path: [] - auth: b path: []
4. 执行脚本
- 给脚本添加执行权限:
chmod +x update_ingress_paths.sh - 运行脚本:
./update_ingress_paths.sh
关键说明
- 若需覆盖原有路径而非追加,将脚本中的
.path += ["$path"]改为.path = ["$path"] - 脚本会自动处理文本中的空格问题,避免因空格导致匹配错误
- yq的
-i参数表示直接修改原YAML文件,若要先预览修改效果,可去掉-i参数查看输出
内容的提问来源于stack exchange,提问作者nray
相关产品推荐
相关产品推荐

