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
)
FYPI,有一种方法可以使用 select
:
实现目标
.packageDirectories[] |=
((select(.default == true) | .ancestorId = "newValue") // . )
我有一个 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
)
FYPI,有一种方法可以使用 select
:
.packageDirectories[] |=
((select(.default == true) | .ancestorId = "newValue") // . )