yq を使用して yaml ファイルの値を置き換えます。

yq を使用して yaml ファイルの値を置き換えます。

Powershellでyqバージョン4.34.1を使用しています。

in値を変数の新しい値に置き換えようとしています.spec.source.targetRevision。だから私が今やっていることは次のとおりです。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

また、次のように二重引用符を削除しようとしましたが、$newTargetRevisionyamlファイルの値はまったく更新されません。

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

成功していないままたくさん試してみました。何か提案してもらえますか?

ありがとう

ベストアンサー1

問題は、シェルが変数を一重引用符で囲んだ文字列の値に拡張すると期待していることです。これはUnixシェルでは何もしません。最も重要なのは、変数値に二重引用符などの特定の文字が含まれていないと仮定することです。

Mike Farahのユーティリティを使用してシェル変数の値を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"

おすすめ記事