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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:20:51