用 yq 保留引号

Preserve quotes with yq

我有以下 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'}"

有人知道怎么做吗?谢谢

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

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

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

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

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

这样只需要对字符串中的双引号进行转义即可。 (这在 csh/tcsh 中不起作用。)

谢谢@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

您可以在 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