AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 793841
Accepted
Mihir
Mihir
Asked: 2025-04-17 07:36:15 +0800 CST2025-04-17 07:36:15 +0800 CST 2025-04-17 07:36:15 +0800 CST

在 Bash 中合并两个 YAML 文件的值

  • 772

bash 命令:

$(System.DefaultWorkingDirectory)/yq_linux_amd64 '. *= load("${{ parameters.HELM_CHART_PATH }}/values/DEV/${{ parameters.COMPONENT }}.yaml")' ${{ parameters.HELM_CHART_PATH }}/values/global-values.yaml > $(System.DefaultWorkingDirectory)/deployment-values.yaml

正在合并两个 YAML 文件中的值,并将合并后的输出发送到单个文件。我无法理解从第一个单引号到输出重定向的语法。有人能帮我理解一下这是什么意思吗?

为什么两个操作数都在运算符后面,也就是*=?.是当前目录,但是 ? 之前是什么意思呢*=?

另外,为什么只有第一个操作数介于之间load (),其含义是什么?

bash
  • 2 2 个回答
  • 94 Views

2 个回答

  • Voted
  1. Best Answer
    Kusalananda
    2025-04-23T12:25:14+08:002025-04-23T12:25:14+08:00

    Mike Farah 的yqYAML 处理器与著名的 JSON 处理器具有类似的表达式语法。它的表达式是过滤器(不过,在本例中,这一点并不重要)。jq

    在表达式中

    . *= load("file")
    

    ...此表达式中的初始点代表“此时的当前文档”,在给​​定的命令中它将是yq从其输入中读取的任何文档,即文件${{ parameters.HELM_CHART_PATH }}/values/global-values.yaml。

    该运算符*=将右侧的文档合并到左侧的文档中,即输入文档,其中包含表达式load("file")生成的任何内容。load()在您问题中的表达式中,该函数将从 加载文档${{ parameters.HELM_CHART_PATH }}/values/DEV/${{ parameters.COMPONENT }}.yaml。

    整个操作是以下命令的具体实例,可以在手册中的合并两个文件部分找到yq:

    yq '. *= load("file2.yml")' file1.yml
    

    有关各种合并操作的更多示例,请参阅父部分乘法(合并)。


    使用Andrey Kislyuk 的,它是yq处理器jq的包装器(因此完全共享其表达式语法),类似的命令看起来像

    yq -y '. *= input' file1 file2
    

    ...再次强调,这里的点代表“此时的当前文档”,并input从输入中读取下一个对象,如果两个文件包含一个顶级文档,那么就. *= load("file2")与 Mike Farah 的完全一样yq。

    该-y选项用于生成 YAML 输出,或者我们将得到一个 JSON 文档。

    • 1
  2. Mihir
    2025-04-17T08:41:04+08:002025-04-17T08:41:04+08:00

    这不是 Bash 的问题。我把答案贴在这里,方便以后大家参考。

    注意:请注意,下面例子中的“命令”只是为了理解,与问题中的“命令”无关。

    YAML 文件的合并是使用名为 YQ 的工具完成的(参考:https ://mikefarah.gitbook.io/yq/operators/multiply-merge )

    我也在这里找到了解释。

    yq '. as $d1 | load("file2.yaml") as $d2 | 
       ($d1 | .paths | keys | .[]) as $i ireduce($d2; 
       .paths[$i] = .paths[$i] // $d1.paths[$i])' file1.yaml
    

    解释:
    高层次上,这通过将路径键从 file1 减少到 file2 来实现,其中每个路径我们要么使用 file2(如果存在),否则使用 file1。

    • '. as $d1 | load("file2.yaml") as $d2 将文件加载到 $d1 和 $d1
    • ($d1 | .paths | keys | .[]) as $i ireduce($d2 将 $d1 中的路径减少到 $d2
    • .paths[$i] = .paths[$i] // $d1.paths[$i] 将 $d1 中的每个路径元素更新到 $d2 中的路径条目。使用替代运算符 // 如果 $d2 路径已存在,则使用现有的路径;否则,将使用 $d1 路径 ($d1.paths[$i])
    • -2

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve