jq - JQ将函数应用于dict但打印周围数据
问题描述
我想要
"1": {
"id": "1",
"type": "select",
"label": "country :",
"choices": {
"1": {
"label": "Canada CAN",
"value": "",
},
"2": {
"label": "United States USA",
"value": ""
}
}
}
生产
"1": {
"id": "1",
"type": "select",
"label": "country :",
"choices": {
"1": {
"label": "Canada",
"value": "CAN",
},
"2": {
"label": "United States",
"value": "USA"
}
}
}
到目前为止,我有一个由类似 sed 的函数组成的两步解决方案
def do_extract:
if .value | test("^$") then
(.value = (.label | capture(".* (?<code>...)")).code) | .label = (.label | capture("(?<name>.*) ...$").name)
else
.
end;
并直接访问子树[]."1"."choices"|keys_unsorted as $key|map_values(do_extract)
,但我必须手动复制粘贴输出来代替原始的“选择”字典。
有没有办法做这个功能,但仍然打印周围的数据?
谢谢
解决方案
为了得到你想要的结果,你可以这样做:
.[].choices[] |= (.label | capture("^(?<label>.*?) (?<value>[^ ]+)$"))
要在您的函数中执行此操作,我会将其更改为:
def do_extract:
if .value == "" then
(.label | capture("^(?<label>.*?) (?<value>[^ ]+)$"))
else
.
end;
然后使用它:
.[].choices[] |= do_extract
推荐阅读
- javascript - Google Pay 是否计算销售税?
- ios - TestFlight 上的 API 调用错误(仅适用于 iPhone 11 Pro)
- java - 无法将 java.lang.String 类型的 url 中的值 https://test.com 转换为 JSONObject
- winapi - 为客户端生成远程调用现有服务器功能的 RPC 代码?
- java - 遍历 JSON 中收到的对象列表
- nginx - Nginx Ingress - 如果没有匹配的路由,如何设置重定向到外部站点?
- javascript - 有没有纯文本html标签之类的东西?
- scala - Scala HashMap#contains 没有任何期望
- c++ - C++ 运算符重载 << 与向量
- php - 输入值前的 Jquery 欧元符号