jq 通过 select 更改特定字段值

jq to change a specific field value by select

我有一个 project.json 文件,其内容如下所示:

{
    "packageDirectories": [
        {
            "path": "sfdx-source/unpackaged"
        },
        {
            "path": "sfdx-source/untracked"
        },
        {
            "path": "sfdx-source/zipsc",
            "package": "ZipSC",
            "versionName": "Version 0.1",
            "versionNumber": "0.1.0.NEXT",
            "ancestorId":"oldValue",
            "default": true
        },
        {
            "path": "sfdx-source/unpackaged/open-cti",
            "package": "OpenCTI",
            "versionName": "Ver 0.3",
            "versionNumber": "0.3.0.NEXT",
            "ancestorId": "04t1P000000cB425QAE",
            "default": false
        }
    ],
    "sfdcLoginUrl": "https://login.salesforce.com",
    "sourceApiVersion": "47.0",
    "namespace": "ZAR",
    "packageAliases": {
        "ZAR": "0Ho1P000000XZA4SAO",
        "OpenCTI": "0Ho1P000000X3AvSAO"
    }
}

我想更改默认为 true 的 packageDirectory 对象的 ancestorId 字段。在这种情况下,示例中的 oldValue 应该变为 newValue。输出应如下所示。如何在 shell 脚本中使用 jq 执行此操作。

{
    "packageDirectories": [
        {
            "path": "sfdx-source/unpackaged"
        },
        {
            "path": "sfdx-source/untracked"
        },
        {
            "path": "sfdx-source/zipsc",
            "package": "ZipariSC",
            "versionName": "Version 0.1",
            "versionNumber": "0.1.0.NEXT",
            "ancestorId":"newValue",
            "default": true
        },
        {
            "path": "sfdx-source/unpackaged/open-cti",
            "package": "OpenCTI",
            "versionName": "Ver 0.3",
            "versionNumber": "0.3.0.NEXT",
            "ancestorId": "04t1P000000cB425QAE",
            "default": false
        }
    ],
    "sfdcLoginUrl": "https://login.salesforce.com",
    "sourceApiVersion": "47.0",
    "namespace": "ZAR",
    "packageAliases": {
        "ZAR": "0Ho1P000000XZA4SAO",
        "OpenCTI": "0Ho1P000000X3AvSAO",
    }
}

你会使用 if-then-else 表达式,而不是 select。

.packageDirectories |= map(
  if .default == true
  then .ancestorId = "newValue"
  else . end
)

demo at jqplay.org

FYPI,有一种方法可以使用 select:

实现目标
.packageDirectories[] |=
  ((select(.default == true) | .ancestorId = "newValue") // . )