在 json 文件中查找特定值并使用 jq 向其附加后缀

find a specific value in json file and append suffix to it using jq

我想匹配 json 文件中的特定值,并在同一个 json 文件中为其附加一个后缀。

这是我的 json 文件

{
  "apiVersion": "argoproj.io/v1alpha1",
  "kind": "Workflow",
  "metadata": {
    "generateName": "kns-vm-"
  },
  "spec": {
    "templates": [{
      "inputs": {
        "parameters": [{
          "name": "un",
          "value": "org"
        }]
      },
      "dag": {
        "tasks": [{
            "name": "create-ns",
            "templateRef": {
              "name": "wft-kn"
            },
            "arguments": {
              "parameters": [{
                "name": "un",
                "value": "{{inputs.parameters.un}}"
              }]
            }
          },
          {
            "name": "create-sm",
            "templateRef": {
              "name": "wft-sn"
            },
            "arguments": {
              "parameters": [{
                "name": "un",
                "value": "{{inputs.parameters.un}}"
              }]
            }
          }
        ]
      }
    }]
  }
}

在此我想找到值 wft-sn 并在其后附加一个后缀 -test

所以更新后的 json 文件应该如下所示

{
  "apiVersion": "argoproj.io/v1alpha1",
  "kind": "Workflow",
  "metadata": {
    "generateName": "kns-vm-"
  },
  "spec": {
    "templates": [{
      "inputs": {
        "parameters": [{
          "name": "un",
          "value": "org"
        }]
      },
      "dag": {
        "tasks": [{
            "name": "create-ns",
            "templateRef": {
              "name": "wft-kn"
            },
            "arguments": {
              "parameters": [{
                "name": "un",
                "value": "{{inputs.parameters.un}}"
              }]
            }
          },
          {
            "name": "create-sm",
            "templateRef": {
              "name": "wft-sn-test"
            },
            "arguments": {
              "parameters": [{
                "name": "un",
                "value": "{{inputs.parameters.un}}"
              }]
            }
          }
        ]
      }
    }]
  }
}

我正在使用下面的 jq 命令,但它不起作用

jq '. | select(.spec.templates[].dag.tasks[].templateRef.name == "wft-sn").name |= . + "-test"' demo.json

我在这里犯了什么错误?我们如何做到这一点?

如果条件的计算结果为 true

select 将重现其输入。因此仅将其应用于您要测试的部分。此外,将整体上下文保留在括号中以将其保留在 top-level 上以供输出:

jq '(.spec.templates[].dag.tasks[].templateRef.name | select(. == "wft-sn")) += "-test"'
{
  "apiVersion": "argoproj.io/v1alpha1",
  "kind": "Workflow",
  "metadata": {
    "generateName": "kns-vm-"
  },
  "spec": {
    "templates": [
      {
        "inputs": {
          "parameters": [
            {
              "name": "un",
              "value": "org"
            }
          ]
        },
        "dag": {
          "tasks": [
            {
              "name": "create-ns",
              "templateRef": {
                "name": "wft-kn"
              },
              "arguments": {
                "parameters": [
                  {
                    "name": "un",
                    "value": "{{inputs.parameters.un}}"
                  }
                ]
              }
            },
            {
              "name": "create-sm",
              "templateRef": {
                "name": "wft-sn-test"
              },
              "arguments": {
                "parameters": [
                  {
                    "name": "un",
                    "value": "{{inputs.parameters.un}}"
                  }
                ]
              }
            }
          ]
        }
      }
    ]
  }
}

我也删除了不必要的 . | 并将 |= . + 减少为 +=