You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jq过滤JSON中supported架构时遇索引错误求助

问题分析与解决

原始数据与需求

目标JSON数据

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
)

需求

筛选出labels中标记为supported的架构名称,预期输出:

amd64
arm64
ppc64le

错误情况

原始执行命令

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")')

报错信息

jq: error (at <stdin>:0): Cannot index string with string "value"

简化命令及报错

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

问题原因

  1. JSON数据不完整:Here-document的结束标记EOF必须单独一行且无任何缩进(空格、Tab),如果EOF前有缩进,会导致MY_JSON变量包含无效内容,jq解析时将其视为字符串而非JSON对象,进而触发Cannot index string with string "value"错误。
  2. 多余的字符处理:tr -d '\000-\031'操作无必要,原始JSON不含控制字符,该操作可能意外破坏JSON结构。
  3. 正则与语法问题:简化命令中的正则表达式^ofasd.io/arch\\.未转义ofasd.io中的.(正则中.匹配任意字符),且若shell未正确包裹jq表达式,会导致jq接收到空的过滤规则,触发状态码5的语法错误。

修正后的命令

方案一(保留原逻辑)

移除多余的tr操作,确保EOF格式正确:

arches=$(echo "$MY_JSON" | 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")')

方案二(更简洁写法)

用startswith替代正则,减少转义复杂度:

arches=$(echo "$MY_JSON" | jq -r '
.properties[]
| select(.type == "new.data")
| .value.labels
| to_entries[]
| select(.key | startswith("ofasd.io/arch.") and .value == "supported")
| .key | sub("^ofasd\\.io/arch\\."; "")')

验证结果

执行修正后的命令,输出符合预期:

amd64
arm64
ppc64le

内容的提问来源于stack exchange,提问作者anechkayf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 02:24:54