使用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
问题原因
- JSON数据不完整:Here-document的结束标记
EOF必须单独一行且无任何缩进(空格、Tab),如果EOF前有缩进,会导致MY_JSON变量包含无效内容,jq解析时将其视为字符串而非JSON对象,进而触发Cannot index string with string "value"错误。 - 多余的字符处理:
tr -d '\000-\031'操作无必要,原始JSON不含控制字符,该操作可能意外破坏JSON结构。 - 正则与语法问题:简化命令中的正则表达式
^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
相关产品推荐
相关产品推荐

