使用 bash、yq、jq 将 yaml 数组替换为 json 格式

replace yaml array with json format using bash, yq, jq

为了使用 yaml 格式显示信息时的可读性,我希望能够用其 json 等效项替换 yaml 数组 问题是我可能有几个实例要在 yaml file/output 中替换为不同的路径

示例:

objects:
  - object:
      name: objA
      inputs:
        - dims:
          - 1
          - 3
  - object:
      name: objB
      outputs:
        - dims:
          - 5

但我希望 dims 数组的输出为 json 格式,例如

objects:
  - object:
      name: objA
      inputs:
        - dims: [1,3]
  - object:
      name: objB
      outputs:
        - dims: [5]

将值从 yaml 转换为 json 很容易,修改 yaml 节点的值很容易,但我不知道如何获取“dims”节点的值,将其转换到 json 值字符串,将其放回节点中(我的意思是不显式搜索所有实例)

总的来说,我正在寻找一种方法来替换节点的值,以及对节点值进行处理的结果(其他示例,将 id 替换为检索到的相应对象的名称通过 REST api 请求)

objects:
  - object:
      name: objA
      dependency: 3fc4bd5b-a6ee-4469-946d-5f780476784e

会显示为

objects:
  - object:
      name: objA
      dependency: name-of-dependency

其中 id 被依赖项的友好名称替换

谢谢

您可以使用 tojson 和更新运算符 |=。这会将您的数组编码为 JSON,这是一个字符串,因此它本身包含在引号中:

yq -y '(.. | .dims? | arrays) |= tojson' 
objects:
  - object:
      name: objA
      inputs:
        - dims: '[1,3]'
  - object:
      name: objB
      outputs:
        - dims: '[5]'

运行 与 Python yq

有mikefarah的yq

yq e '.objects[].object["inputs","outputs"][].dims? |= "["+join(",")+"]"' data.yml