鉴于:
MY_JSON=$(cat <<EOF
{
"schema": "my.schema",
"properties": [
{
"type": "new.data",
"value": {
"labels": {
"ofasd.io/arch.amd64": "supported",
"ofasd.io/arch.arm64": "supported",
"ofasd.io/arch.ppc64le": "supported",
"ofasd.io/arch.s390x": "unsupported"
}
}
}
]
}
EOF
)
我正在尝试仅过滤“受支持的”架构:
arches=$(echo "$MY_JSON" | tr -d '\000-\031' | jq -r '
.properties[]
| select(.type == "new.data")
| .value.labels
| to_entries
| map(select(.key | test("^ofasd\\.io/arch\\.") and .value == "supported"))
| map(.key | sub("^ofasd\\.io/arch\\."; ""))
| join("\n")')
预期输出:
amd64
arm64
ppc64le
实际产量:
jq: error (at <stdin>:0): Cannot index string with string "value"
有人能帮我理解我做错了什么吗?问题似乎是 ofasd.io/arch.* 过滤不起作用。当我运行:
echo "$MY_JSON" | jq -r '
.properties[]
| select(.type == "new.data")
| .value.labels
| to_entries
| map(select(.key | test("^ofasd.io/arch\\.") and .value == "supported"))'
我得到:
echo "$MY_JSON" | jq -r '' failed with status 5
在 中
select(.key | test("^ofasd\\.io/arch\\.") and .value == "supported")
,你深入.key
,制作你的test
(顺便说一句,可以简化为startswith("ofasd.io/arch.")
),但这样就不再有.value
( 内部.key
)了。将其括在括号中以保留上下文:select((.key | test("^ofasd\\.io/arch\\.")) and .value == "supported")
这是一个简化版本
演示
管道运算符(
|
)的优先级比您想象的要高,并且其中的条件map(select(...))
以您想要的不同方式进行评估。您可以通过用
.key | test("^ofasd\\.io/arch\\.")
括号括起来来修复它。我将
join("\n")
使用数组迭代器 (.[]
)。结合命令行选项-r
(原始输出),它会产生您期望的输出。如果您早些时候应用迭代器,那么之后就
to_entries
不再需要了map()
:您可以在这个JQ 游乐场上看到它的运行。