1

我有以下 yq 命令

yq e '.values.tags="{tag1:'value1', tag2:'value2'}"' -i my file.yaml 

我需要引用这些值。当我使用 yq 运行查询时,值周围的引号被删除。我尝试了一些方法来删除它们,但到目前为止没有任何效果。

在我的 yaml 文件中,它最终是这样的:

values:
    tags: "{tag1:value1, tag2:value2}"

虽然我期望这个:

values:
    tags: "{tag1:'value1', tag2:'value2'}"

有谁知道如何做到这一点?谢谢

4

3 回答 3

2

单引号由您的 shell 解释。Shell 连接引用和未引用的相邻值。从 shell 的角度来看,您提供了以下相邻值:

.values.tags="{tag1:
value1
, tag2:
value2
}"

这些是串联的,结果就是您所看到的。

有几种方法可以解决这个问题。我建议在 shell 级别使用双引号作为值:

yq e ".values.tags=\"{tag1:'value1', tag2:'value2'}\"" -i myfile.yaml

这样,您只需要转义字符串中的双引号。(这在 csh/tcsh 中不起作用。)

于 2021-04-21T08:46:15.253 回答
1

您可以使用 yq 中的 from_json 和 to_json 运算符来就地编辑它:

yq e '.values.tags |= (from_yaml | .tag1 = "cat" | to_json(0))' file.yaml

有关更多信息,请参阅https://mikefarah.gitbook.io/yq/operators/encode-decode

披露:我写了yq

于 2021-11-29T10:56:26.633 回答
0

谢谢@flyx。您提到的解决方案帮助我解决了我的问题。我需要将 yaml 转换为 json,修改然后再次将其转换回 yaml。

我就是这样做的:

cat abc.yaml | sed -e 's,\",\\",g' | yq eval -j | jq . > bca.json
jq -e '(.spec.template.spec.volumes[1]) = "" '  bca.json | sponge bca.json
yq eval -P bca.json > bca.yaml
sed -i -e 's,\\",\",g' bca.yaml
于 2021-08-04T09:19:35.150 回答