![使用 yq 替换 yaml 文件中的值](https://linux22.com/image/229585/%E4%BD%BF%E7%94%A8%20yq%20%E6%9B%BF%E6%8D%A2%20yaml%20%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%80%BC.png)
我在 powershell 中使用 yq 版本 4.34.1。
我尝试用变量中的新值替换.spec.source.targetRevision
in的值。所以,我现在正在做的事情如下。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