我有一个包含以下内容的
input.json
文件:
{
"noise1": 5,
"signal": [
{
"name": "child-signal-1",
"nested": {
"prop": "child-prop-3"
}
},
{
"name": "child-noise-2",
"nested": {
"prop": "child-prop-3"
}
},
{
"name": "child-signal-3",
"nested": {
"prop": "child-prop-3"
}
}
],
"noise2": [
{
"name": "child-signal-1",
"nested": {
"prop": "child-prop-3"
}
},
{
"name": "child-noise-2",
"nested": {
"prop": "child-prop-3"
}
},
{
"name": "child-signal-3",
"nested": {
"prop": "child-prop-3"
}
}
]
}
使用
jq
,我想读取该文件并输出:
{
"noise1": 5,
"signal": [
{
"name": "child-signal-1",
"nested": {
"prop": "CHANGED-1"
}
},
{
"name": "child-noise-2",
"nested": {
"prop": "child-prop-3"
}
},
{
"name": "child-signal-3",
"nested": {
"prop": "CHANGED-3"
}
}
],
"noise2": [
{
"name": "child-signal-1",
"nested": {
"prop": "child-prop-3"
}
},
{
"name": "child-noise-2",
"nested": {
"prop": "child-prop-3"
}
},
{
"name": "child-signal-3",
"nested": {
"prop": "child-prop-3"
}
}
]
}
我偶然发现了答案,但我不完全理解它为什么有效,特别是与我之前尝试过的所有内容相比(参见下面的#2):
.signal[] |= (select(.name | contains("signal")) .nested.prop = (.name | gsub(".*-(?<namedigit>[0-9])"; "CHANGED-\(.namedigit)")))
有没有更简单的方法来写上面的内容?
为什么我所有其他尝试都打印多个 json 对象:
.signal[] | select(.name | contains("signal")) as $matches | .
(.signal[] | select(.name | contains("signal"))) as $matches | .
.signal[] | select(.name | contains("signal")) | .nested.prop = (.name | gsub(".*-(?<namedigit>[0-9])"; "CHANGED-\(.namedigit)"))
需要明确的是:我并不是要求对每个内容进行详细解释,我只是假设它们共享一个导致多个 json 输出的共同主题,并且我想了解那是什么。