首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >yq:如何读取同级元素值?

yq:如何读取同级元素值?
EN

Stack Overflow用户
提问于 2020-10-05 17:32:26
回答 2查看 994关注 0票数 3

我正在探索yq以修改我的YAML,其中我想在spec of ImageStream和name == openshift45下添加一个新元素。

代码语言:javascript
复制
apiVersion: v1
items:
- apiVersion: image.openshift.io/v1
  kind: ImageStream
  metadata:
    annotations:
      openshift.io/generated-by: OpenShiftNewApp
    creationTimestamp: null
    labels:
      app: openshift45
      app.kubernetes.io/component: openshift45
      app.kubernetes.io/instance: openshift45
    name: nodejs-10
  spec:
    lookupPolicy:
      local: false
    tags:
    - annotations:
        openshift.io/imported-from: registry.access.redhat.com/ubi8/nodejs-10
      from:
        kind: DockerImage
        name: registry.access.redhat.com/ubi8/nodejs-10
      generation: null
      importPolicy: {}
      name: latest
      referencePolicy:
        type: ""
  status:
    dockerImageRepository: ""
- apiVersion: image.openshift.io/v1
  kind: ImageStream
  metadata:
    annotations:
      openshift.io/generated-by: OpenShiftNewApp
    creationTimestamp: null
    labels:
      app: openshift45
      app.kubernetes.io/component: openshift45
      app.kubernetes.io/instance: openshift45
    name: openshift45
  spec:
    lookupPolicy:
      local: false
  status:
    dockerImageRepository: ""

下面的命令返回有效的metadata元素。现在,我想转移到父级,然后选择spec。这在yq - https://github.com/mikefarah/yq中有可能吗?

代码语言:javascript
复制
yq r openshift45.yaml --printMode pv "items(kind==ImageStream).(name==openshift45)"

返回

代码语言:javascript
复制
items.[1].metadata:
  annotations:
    openshift.io/generated-by: OpenShiftNewApp
  creationTimestamp: null
  labels:
    app: openshift45
    app.kubernetes.io/component: openshift45
    app.kubernetes.io/instance: openshift45
  name: openshift45

预期产出:

代码语言:javascript
复制
apiVersion: v1
items:
- apiVersion: image.openshift.io/v1
  kind: ImageStream
  metadata:
    annotations:
      openshift.io/generated-by: OpenShiftNewApp
    creationTimestamp: null
    labels:
      app: openshift45
      app.kubernetes.io/component: openshift45
      app.kubernetes.io/instance: openshift45
    name: nodejs-10
  spec:
    lookupPolicy:
      local: false
    tags:
    - annotations:
        openshift.io/imported-from: registry.access.redhat.com/ubi8/nodejs-10
      from:
        kind: DockerImage
        name: registry.access.redhat.com/ubi8/nodejs-10
      generation: null
      importPolicy: {}
      name: latest
      referencePolicy:
        type: ""
  status:
    dockerImageRepository: ""
- apiVersion: image.openshift.io/v1
  kind: ImageStream
  metadata:
    annotations:
      openshift.io/generated-by: OpenShiftNewApp
    creationTimestamp: null
    labels:
      app: openshift45
      app.kubernetes.io/component: openshift45
      app.kubernetes.io/instance: openshift45
    name: openshift45
  spec:
    *dockerImageRepository: <$MYREGISTRY>/<$MYNAMESPACE>/<$MYPROJECT>*
    lookupPolicy:
      local: false
  status:
    dockerImageRepository: ""
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-06 07:18:22

对于如何使用多个条件来获取所需的对象,mikefarah/yq中的路径表达式并没有很好的文档来展示一个实际的例子。因此,对于有问题的YAML,使用一个独特的条件,您可以这样做,如下所示。在yq version 3.3.2中验证

代码语言:javascript
复制
yq w openshift45.yaml 'items.(metadata.name == openshift45).spec.dockerImageRepository' '<$MYREGISTRY>/<$MYNAMESPACE>/<$MYPROJECT>'

您可以使用-i标志和写一起修改YAML。请参阅就地更新文件

如果这是不需要的,并且需要多个条件选择才能到达所需的对象,那么建议在GitHub页面上提出一个问题-- https://github.com/mikefarah/yq/issues请求相同的正确语法。

票数 2
EN

Stack Overflow用户

发布于 2020-10-05 17:52:25

目前,在yq中是不可能的。您必须在变量中获得第一个命令的输出,并将该变量传递给下一个变量。

yq是jq的包装器,但它没有自定义函数的功能。自定义函数使得可以在一个地方使用文档的任何层次结构中的任何值。

感谢伊尼安指出OP没有使用包装器yq版本。不幸的是,所使用的版本目前也不允许使用自定义函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64213503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档