将键与 jq 中的正则表达式匹配

将键与 jq 中的正则表达式匹配

我正在编写一个分析 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的值, 如下所示:key11key12key13

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](即不附加_yesor _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
}

相关内容