首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何提取普通的“to”以保持脚本的干燥?

如何提取普通的“to”以保持脚本的干燥?
EN

Stack Overflow用户
提问于 2022-08-19 22:38:38
回答 2查看 52关注 0票数 1

我有以下内容(从https://stackoverflow.com/a/70152440/807037修改):

代码语言:javascript
复制
yq eval-all '
    .clusters = ( 
        (   
            (.clusters[] | {.name: .}) as $item ireduce ({}; . * $item)
        ) as $uniqueMap |
        ( $uniqueMap  | to_entries | .[]) as $item ireduce([]; . + $item.value)
    ) | 
    .contexts = ( 
        (
            (.contexts[] | {.name: .}) as $item ireduce ({}; . * $item)
        ) as $uniqueMap |
        ( $uniqueMap  | to_entries | .[]) as $item ireduce([]; . + $item.value)
    ) | 
    select(fi == 0)' konfig monfig

如何提取以下通用代码以使脚本保持干燥:

代码语言:javascript
复制
.«KEY» = (
        (
            (.«KEY»[] | {.name: .}) as $item ireduce ({}; . * $item)
        ) as $uniqueMap |
        ( $uniqueMap  | to_entries | .[]) as $item ireduce([]; . + $item.value)
    )

输入文件:

代码语言:javascript
复制
# konfig
apiVersion: apiVersion-keep
clusters:
- cluster:
    certificate-authority-data: cad-0
    server: server-0
  name: name-0
- cluster:
    certificate-authority-data: cad-1-discard
    server: server-1-discard
  name: name-1
- cluster:
    certificate-authority-data: cad-2
    server: server-2
  name: name-2
contexts:
- context:
    cluster: cluster-0
    user: user-0
  name: name-0
- context:
    cluster: cluster-1-discard
    user: user-1-discard
  name: name-1
- context:
    cluster: cluster-2
    user: user-2
  name: name-2
current-context: name-keep
代码语言:javascript
复制
# monfig
apiVersion: apiVersion-discard
clusters:
- cluster:
    certificate-authority-data: cad-1-keep
    server: server-1-keep
  name: name-1
contexts:
- context:
    cluster: cluster-1-keep
    user: user-1-keep
  name: name-1
current-context: name-discard

预期:

代码语言:javascript
复制
apiVersion: apiVersion-keep
clusters:
- cluster:
    certificate-authority-data: cad-0
    server: server-0
  name: name-0
- cluster:
    certificate-authority-data: cad-1-keep
    server: server-1-keep
  name: name-1
- cluster:
    certificate-authority-data: cad-2
    server: server-2
  name: name-2
contexts:
- context:
    cluster: cluster-0
    user: user-0
  name: name-0
- context:
    cluster: cluster-1-keep
    user: user-1-keep
  name: name-1
- context:
    cluster: cluster-2
    user: user-2
  name: name-2
current-context: name-keep
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-23 01:17:07

这个问题比看起来要复杂一些,因为|=的一个用例正在更新每个匹配的左侧节点。.clusters会产生两个节点(与.contexts一样),每个节点都会被独立更新。yq不知道如何将节点分组。在玩了一会儿之后,我把这个做好了:

代码语言:javascript
复制
./yq eval-all '
  . ref $r |
  with( ("clusters", "contexts"); 
    $r[.] = ( 
        (
            ($r[.] | .[] | {.name: .}) as $item ireduce ({}; . * $item)
        ) as $uniqueMap |
        ( $uniqueMap  | to_entries | .[]) as $item ireduce([]; . + $item.value)
    )
  ) | select(fi==0)' file1.yaml file2.yaml

解释:

  • . ref $r创建对根上下文的引用,称为$r。这与顶级节点(file1和file2)匹配。
  • 使用with运算符,我可以根据$r参数化合并表达式,传入需要合并的两条路径。每个路径都是针对$r[.]中的根上下文$r[.]运行的。

希望这是合理的!

免责声明:我写了yq

票数 3
EN

Stack Overflow用户

发布于 2022-08-21 07:48:47

一般来说(由于缺少样本数据),您可以使用更新操作符 |= (从v4.3.0开始就可以使用),使您能够在RHS上通过上下文.来解决问题。然后,由于绝对上下文只出现在LHS上,您可以立即列出所有您希望将其应用到的上下文。

代码语言:javascript
复制
(.clusters, .contexts) |= ( .[] | ... )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73422860

复制
相关文章

相似问题

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