如何通过Linux命令或脚本从config.yaml提取值替换values.yaml的secrets列表?
问题
现有两个YAML文件,需要将values.yaml中secrets键的列表值替换为从config.yaml中提取的VE_PASS1、VE_PASS2。
原始文件内容
config.yaml
myenv1: abc: efg host: ( ENV["HOST1"] ) db: ( ENV["DB1"] ) user: <%= ENV["USER1"] %> pass: <%= ENV["VE_PASS1"] %> time: 00 myenv2: abc: efg host: ( ENV["HOST2"] ) db: ( ENV["DB2"] ) user: <%= ENV["USER2"] %> pass: <%= ENV["VE_PASS2"] %> time: 800
values.yaml
secrets: - MY_PASS_1 - MY_PASS_2 abc: - pqr psp: - jdfhs
目标结果
修改后的values.yaml需如下:
secrets: - VE_PASS1 - VE_PASS2 abc: - pqr psp: - jdfhs
请问实现该需求的Linux命令或脚本是什么?
解决方案
以下提供几种可行的实现方式:
方法一:使用yq(推荐,YAML专用工具)
yq是专门处理YAML的命令行工具,能精准操作YAML结构,避免正则处理的潜在问题。
命令示例:
# 提取config.yaml中pass字段内的VE_PASS值,转为逗号分隔的字符串 PASS_LIST=$(yq eval '.[] | .pass' config.yaml | grep -oP 'VE_PASS\d+' | paste -sd ',' -) # 替换values.yaml的secrets列表并直接修改原文件 yq eval ".secrets = [${PASS_LIST}]" -i values.yaml
如果你的yq是v4版本,语法略有调整:
PASS_LIST=$(yq e '.. | select(has("pass")) | .pass' config.yaml | grep -oP 'VE_PASS\d+' | paste -sd ',' -) yq e ".secrets = [${PASS_LIST}]" -i values.yaml
方法二:使用grep+sed组合(依赖系统基础工具)
如果系统未安装yq,可通过基础文本处理工具实现:
# 提取所有VE_PASS开头的字符串,每行添加YAML列表缩进前缀 SECRETS=$(grep -oP 'VE_PASS\d+' config.yaml | sed 's/^/ - /') # 替换values.yaml中secrets下的原有列表项 sed -i "/^secrets:/,/^[^ ]/{/^ - /d; /^secrets:/a\\ ${SECRETS} }" values.yaml
说明:
/^secrets:/,/^[^ ]/:匹配从secrets:行开始到下一个非缩进行的范围/^ - /d:删除该范围内的原有列表项/^secrets:/a\\${SECRETS}:在secrets:行后追加提取到的新列表内容
方法三:使用awk脚本
# 第一步:提取config.yaml中的VE_PASS值,存入临时文件 awk '/VE_PASS/ {sub(/.*ENV\["/, "", $2); sub(/\"\] %>/, "", $2); print $2}' config.yaml > pass.tmp # 第二步:处理values.yaml,替换secrets部分 awk ' BEGIN { # 读取临时文件中的VE_PASS值到数组 while ((getline line < "pass.tmp") > 0) { secrets[++m] = line } close("pass.tmp") } /^secrets:/ { print $0 # 输出新的secrets列表项 for (i=1; i<=m; i++) { print " - " secrets[i] } flag=1 next } # 遇到非缩进行时,退出替换模式 flag && /^[^ ]/ { flag=0 } # 非替换模式下正常输出行 !flag {print $0} ' values.yaml > values.tmp && mv values.tmp values.yaml && rm pass.tmp
内容的提问来源于stack exchange,提问作者AnjK
相关产品推荐
相关产品推荐

