jq 不区分大小写键过滤器

jq unsensitive case key filter

来自这个“test.json”文件:

{
  "key1": "abc",
  "key2": "def",
  "key3": "ghi"
}

我可以使用以下命令更新“key2”值:

jq '.key2="123"' test.json

但是,有没有办法使用不区分大小写的密钥过滤器并使此命令有效:

jq '.KeY2="123"' test.json

还有...如果在 JSON 文件中找不到密钥,则不执行任何操作。默认行为是附加搜索到的键。

test(regex; "i")可以用来在jq中进行不区分大小写的正则表达式匹配。因此:

jq --arg key KeY2 --arg newValue 123 '
  [to_entries[] |
   if .key | test($key; "i") then
     .value = $newValue
   else . end
  ] | from_entries' <test.json

也就是说,由于这是一个正则表达式匹配,您可能需要考虑一下您的键名如何作为正则表达式——锚定等。另一种方法是将两个版本都转换为小写,仅用于比较:

jq --arg key KeY2 --arg newValue 123 '
  ($key | ascii_downcase) as $lower_key |
  [to_entries[] |
   if (.key | ascii_downcase) == $lower_key then
     .value = $newValue
   else . end
  ] | from_entries' <test.json

您可以使用ascii_downcase获取密钥的小写版本:

jq --arg k Key1 '(.[$k | ascii_downcase] // empty) = "123"'

// empty 部分阻止创建密钥。