我有一个从curl 返回的JSON 数组,如下所示:
[
{
"title": "Some Title",
"tags":"tagA tag-B tagC"
},
{
"title": "Some Title 2",
"tags":"tagA tagC"
},
...
]
我想把它转换成...
[
{
"title": "Some Title",
"tags":["tagA",
"tag-B",
"tagC"]
},
{
"title": "Some Title 2",
"tags":["tagA",
"tagC"]
},
...
]
到目前为止我有:
(map(select(.tags!=null)) | map(.tags | split(" "))) as $tags | $tags
这似乎给了我类似的东西:
[
[
"tagA",
"tag-B",
"tagC"
],
[
"tagA",
"tagC"
]
]
但我似乎无法将其编织回输出中,该输出将给我.tags
作为原始对象中具有原始值的数组......
答案1
你让事情变得比实际情况复杂得多。只需使用map()
和|=
:
jq 'map(.tags |= split(" "))' file.json
编辑:
如果您想处理没有以下内容的条目tags
:
jq 'map(try(.tags |= split(" ")))' file.json
或者,如果您想保持所有条目不变,但不带tags
:
jq 'map(try(.tags |= split(" ")) // .)' file.json
结果:
[
{
"tags": [
"tagA",
"tag-B",
"tagC"
],
"title": "Some Title"
},
{
"tags": [
"tagA",
"tagC"
],
"title": "Some Title 2"
}
]
答案2
您可以尝试如下sed
:
下面的代码使用 GNU 版本的 sed(尽管它也可以用 POSIX 兼容的方式编写)
sed -e '
/[{]/,/[}]/!b
/"tags":/!b
h;s/"tags":/&\n/;s/\n.*/ /;s/./ /g;x
s/"tags":/&\n/
:a
s/\(\n.*\)\([^"]\) \([^"]\)/\1\2","\3/;ta
y/\n/[/;s/$/]/;G
:b
s/","\(.*\)\(\n.*\)/",\2"\1\2/;tb
s/\(.*\)\n.*/\1/
' yourjsonfile
在职的
{
我们选择下一行的范围}
。- 在线放大
"tags"
所选范围内的线。 - 计算给定标签的嵌套空间并将其存储在hold中。
- 在循环中双引号标记数据
:a
,
在循环中的后面插入嵌套空格:b
- 删除模式空间中最后一个换行符之后的所有内容并打印。
结果
[
{
"title": "Some Title",
"tags":["tagA",
"tag-B",
"tagC"]
},
{
"title": "Some Title 2",
"tags":["tagA",
"tagC"]
},
...
]