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
相关产品推荐
相关产品推荐

