用 jq 替换数组值(如果存在)
Replace array values if they exist with jq
虽然我经常使用 jq
,但我主要是为了完成更简单的任务。这个把我的脑子打成了一个结。
我有一些单元测试的 JSON 输出需要修改。具体来说,我需要删除(或替换)一个错误值,因为测试框架生成的输出长达数百行。
JSON 看起来像这样:
{
"numFailedTestSuites": 1,
"numFailedTests": 1,
"numPassedTestSuites": 1,
"numPassedTests": 1,
...
"testResults": [
{
"assertionResults": [
{
"failureMessages": [
"Error: error message here"
],
"status": "failed",
"title": "matches snapshot"
},
{
"failureMessages": [
"Error: another error message here",
"Error: yet another error message here"
],
"status": "failed",
"title": "matches another snapshot"
}
],
"endTime": 1617720396223,
"startTime": 1617720393320,
"status": "failed",
"summary": ""
},
{
"assertionResults": [
{
"failureMessages": [],
"status": "passed",
},
{
"failureMessages": [],
"status": "passed",
}
]
}
]
}
我想将 failureMessages
中的每个元素替换为通用 failed
消息或自身的截断版本(假设为 100 个字符)。
棘手的部分(对我来说)是 failureMessages
是一个数组,可以有 0-n 个值,我需要修改所有这些值。
我知道我可以用 select(.. | .failureMessages | length > 0)
找到非空数组,但这就是我所能得到的,因为我实际上不需要 select
项,我需要替换它们并得到完整 JSON 返回。
最简单的解决方案是:
.testResults[].assertionResults[].failureMessages[] |= .[0:100]
检查一下online!
在线示例仅保留失败消息的前 10 个字符,以显示对您在问题中发布的示例 JSON 的影响(它包含简短的错误消息)。
在 JQ 文档中阅读有关 array/string slice (.[a:b]
) and update assignment (|=
) 的内容。
虽然我经常使用 jq
,但我主要是为了完成更简单的任务。这个把我的脑子打成了一个结。
我有一些单元测试的 JSON 输出需要修改。具体来说,我需要删除(或替换)一个错误值,因为测试框架生成的输出长达数百行。
JSON 看起来像这样:
{
"numFailedTestSuites": 1,
"numFailedTests": 1,
"numPassedTestSuites": 1,
"numPassedTests": 1,
...
"testResults": [
{
"assertionResults": [
{
"failureMessages": [
"Error: error message here"
],
"status": "failed",
"title": "matches snapshot"
},
{
"failureMessages": [
"Error: another error message here",
"Error: yet another error message here"
],
"status": "failed",
"title": "matches another snapshot"
}
],
"endTime": 1617720396223,
"startTime": 1617720393320,
"status": "failed",
"summary": ""
},
{
"assertionResults": [
{
"failureMessages": [],
"status": "passed",
},
{
"failureMessages": [],
"status": "passed",
}
]
}
]
}
我想将 failureMessages
中的每个元素替换为通用 failed
消息或自身的截断版本(假设为 100 个字符)。
棘手的部分(对我来说)是 failureMessages
是一个数组,可以有 0-n 个值,我需要修改所有这些值。
我知道我可以用 select(.. | .failureMessages | length > 0)
找到非空数组,但这就是我所能得到的,因为我实际上不需要 select
项,我需要替换它们并得到完整 JSON 返回。
最简单的解决方案是:
.testResults[].assertionResults[].failureMessages[] |= .[0:100]
检查一下online!
在线示例仅保留失败消息的前 10 个字符,以显示对您在问题中发布的示例 JSON 的影响(它包含简短的错误消息)。
在 JQ 文档中阅读有关 array/string slice (.[a:b]
) and update assignment (|=
) 的内容。