我正在编写一个分析 JSON 输入的脚本 ( jsonfile
):
{
"key11":1010,"key11_yes":13,"key11_no":14,
"key12":12120,"key12_yes":9,"key12_no":25,
"key13":12103,"key13_yes":13,"key13_no":20
}
我想使用, 并检查,jq tools
的值, 如下所示:key11
key12
key13
cat jsonfile | jq 'key[1-9][1-9]'
我希望该模式像 -style 正则表达式一样工作grep
:
cat jsonfile | grep 'key[1-9][1-9]'
如果匹配键的值为 null,那么我的脚本应该exit 0
.
另外,我需要检查第二个参数 if key[1-9]_[this part is null]
(即不附加_yes
or _no
),然后exit 0
。
答案1
jq
的正则表达式过滤器 ( test
, match
, capture
) 将原始文本作为输入。要将正则表达式应用于键名称,您首先必须将这些键名称转换为文本。
jq
提供一个函数to_entries
为了那个原因:
cat jsonfile | jq 'to_entries'
输出:
[ { “密钥”:“密钥11”, “值”:1010 }, { “密钥”:“key11_yes”, “值”:13 }, { “密钥”:“key11_no”, “值”:14 }, { “密钥”:“密钥12”, “值”:12120 }, ... ]
然后可以将其输入到提取密钥的过滤器中,根据正则表达式对其进行测试,然后输出整个条目或忽略它:
if (.key|test("key[0-9][0-9]$")) then ( {key: .key, value: .value } ) else empty end
匹配from_entries
函数可以将剩余条目转换回其原始形式,或者with_entries
可以一步完成所有操作:
cat jsonfile|jq 'with_entries(if (.key|test("key[0-9][0-9]$")) then ( {key: .key, value: .value } ) else empty end )'
结果是输入中键与模式匹配的所有对:
{
"key11": 1010,
"key12": 12120,
"key13": 12103
}