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
部分阻止创建密钥。
来自这个“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
部分阻止创建密钥。