我想获得此topics
中的所有json
:
$ wget https://raw.githubusercontent.com/exercism/c/master/config.json
$ cat config.json | jq merge(.[].topics)
但是显然上面的代码不起作用...
最后,我希望列出所有主题:
arrays
control_flow_loops
...
我对regexp更为熟悉,一种不涉及jq
的解决方案可能是:
$ perl -0777 -ne 'print $_ =~ s/[ ",]//gr for
m/topics.*?\[\K.*?(?=\])/smg' config.json | sort -u
示例
使用此输入:
{
"exercises": [
{
"topics": [
"foo"
]
},
{
"topics": [
"bar",
"baz"
]
},
{
"topics": [
"foo",
"qux"
]
}
]
}
我想要这个输出:
foo
bar
baz
qux
答案 0 :(得分:2)
怎么样
< config.json jq '.. | objects | .topics[]?'
如果您要删除重复项,则可以将以上内容通过管道传输到sort -u
中,或使用jq执行相同的操作,例如使用unique
。
在某些情况下,..
可能不合适,因此这里提供了一个..
的免费解决方案来解决当前的问题:
< config.json jq '[.[][]?.topics[]?] | unique[]'
答案 1 :(得分:0)
因为该问题可以重新定义为“ “如何使用我的JSON实现该操作”” (JSON是数据模型,并且在处理工具上没有垄断性),所以让我向您展示使用Unix walk-path
实用程序 jtc
的替代方法。
-遍历您可以做的所有topics
:
bash $ <this.json jtc -w'<topics>l:[:]'
"foo"
"bar"
"baz"
"foo"
"qux"
那里的walk-path
(-w
)并不那么复杂:
<topics>l:
-将递归地查找标签为topics
的每个 JSON元素[:]
-将在上一步中遍历找到的JSON元素中的所有元素-要消除重复,可以将其传递给sort -u
,也可以通过再次传递给jtc
来排序唯一性:
bash $ <this.json jtc -w'<topics>l:[:]' -j | jtc -w'<.>q1:'
"foo"
"bar"
"baz"
"qux"
-j
将第一个输出包装到 JSON数组中。<.>q1:
将迭代从第二个开始的所有原始 JSON元素(第一个将是数组本身)。免责声明:
我是jtc
工具的创建者,这个答案的目的只是为了展示问题的替代解决方案。我并不想在现有工具上推广使用我的工具。