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

yq操作YAML数组返回字符串字面量而非数组,如何解决?

解决yq替换YAML数组时被转为字符串字面量的问题

我用yq操作YAML文件,尝试通过变量替换.spec.data的值,但结果不符合预期:spec.data被生成字符串字面量(带|-块标记),而非保持数组格式。怎么实现数组替换且不转为字符串?

原始YAML

spec:
  data:
    - secretKey: VARIABLE_1
      remoteRef: 
        key: VARIABL_1
    - secretKey: VARIABLE_N
      remoteRef: 
        key: VARIABLE_N

当前错误输出

spec:
  data: |-
    - secretKey: NEW_VARIABLE_1
      remoteRef:
        key: NEW_VARIABLE_1
    - secretKey: NEW_VARIABLE_2
      remoteRef:
        key: NEW_VARIABLE_2
    - secretKey: NEW_VARIABLE_N
      remoteRef:
        key: NEW_VARIABLE_N

期望输出

spec:
  data: 
    - secretKey: NEW_VARIABLE_1
      remoteRef:
        key: NEW_VARIABLE_1
    - secretKey: NEW_VARIABLE_2
      remoteRef:
        key: NEW_VARIABLE_2
    - secretKey: NEW_VARIABLE_N
      remoteRef:
        key: NEW_VARIABLE_N

原始代码

bashArray=("NEW_VARIABLE_1" "NEW_VARIABLE_2" "NEW_VARIABLE_N")

keys=$(jq -c -n '$ARGS.positional' --args "${bashArray[@]}")

# 创建新数据的JSON数组
new_data=$(echo "$keys" | jq -nR '[inputs|{secretKey: ., remoteRef: {key: .}}]')

# 将JSON数组转为YAML并更新文件
new_data_yaml=$(echo "$new_data" | yq e -P -  )

yq e -i ".spec.data = \"$new_data_yaml\"" test.yaml

问题原因

你把JSON转成YAML字符串后,用双引号包裹赋值给.spec.data,yq会把这个字符串当作字面量值,自动加上块标记|-,而不是解析成YAML数组。

修正方案1(保留jq)

不需要把JSON转成YAML字符串,直接让yq读取JSON格式的数组并赋值,yq可以自动识别JSON并转换成对应的YAML结构:

bashArray=("NEW_VARIABLE_1" "NEW_VARIABLE_2" "NEW_VARIABLE_N")

# 直接生成JSON数组,无需转YAML字符串
new_data=$(jq -n '$ARGS.positional | map({secretKey: ., remoteRef: {key: .}})' --args "${bashArray[@]}")

# 让yq直接解析JSON并赋值给.spec.data
yq e -i ".spec.data = $new_data" test.yaml

修正方案2(纯yq实现,v4.18+适用)

如果你的yq版本是v4.18及以上,可以直接用yq处理bash数组,省去jq步骤:

bashArray=("NEW_VARIABLE_1" "NEW_VARIABLE_2" "NEW_VARIABLE_N")

# 把bash数组传递给yq,生成对应结构并替换
yq e -i ".spec.data = [${bashArray[@]/#/\"\"}] | map({secretKey: ., remoteRef: {key: .}})" test.yaml

说明

  • 方案1:保留jq生成JSON数组,直接让yq解析JSON赋值,yq会自动将JSON数组转为YAML数组,不会当作字符串处理。
  • 方案2:利用yq的数组和map功能,直接把bash数组转成YAML需要的结构,一步完成替换,更简洁。

内容的提问来源于stack exchange,提问作者MaryCoding

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:30:24