使用 yq 替换 yaml 文件中的值

使用 yq 替换 yaml 文件中的值

我在 powershell 中使用 yq 版本 4.34.1。

我尝试用变量中的新值替换.spec.source.targetRevisionin的值。所以,我现在正在做的事情如下。target.yaml$newTargetRevision

$newTargetRevision = "v1.1.1-1"
yq -i '.spec.source.targetRevision = "$newTargetRevision"' target.yaml

我得到的如下。

spec:
  source:
    targetRevision: &default $newTargetRevision

我期望得到:-

spec:
  source:
    targetRevision: &default v1.1.1-1

我还尝试删除双引号,$newTargetRevision如下所示,但 yaml 文件中的值根本没有更新。

yq -i '.spec.source.targetRevision = $newTargetRevision' target.yaml

我尝试了很多事情但没有成功。你能建议一下吗?

谢谢

答案1

您的问题是您期望 shell 将变量扩展到单引号字符串中的值,这是 Unix shell 不会做的事情。最重要的是,您假设变量的值不包含某些特定字符,例如双引号。

要使用 Mike Farah 的实用程序将 shell 变量的值正确插入(而不是注入)到 YAML 文档中yq,您可以env()从环境中读取变量的值:

newrevision=$newTargetRevision \
yq -i '.spec.source.targetRevision = env(newrevision)' target.yaml

这会将环境变量设置newrevision为变量的值newTargetRevision,然后在就地编辑中修改文档中的正确位置。您还可以导出该newTargetRevision变量,并将其名称与env().

测试:

$ cat target.yaml
spec:
  source:
    targetRevision: &default v1.0
$ newTargetRevision='v1.1 "kangaroo"'
$ newrevision=$newTargetRevision yq -i '.spec.source.targetRevision = env(newrevision)' target.yaml
$ cat target.yaml
spec:
  source:
    targetRevision: &default v1.1 "kangaroo"

答案2

我终于明白了。以下内容在 powershell 中运行良好。

yq -i ".spec.source.targetRevision = `"${newTargetRevision}`"" target.yaml

相关内容