在jq中将字符串字段拆分为数组?

在jq中将字符串字段拆分为数组?

我有一个从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

在职的

  1. {我们选择下一行的范围}
  2. 在线放大"tags"所选范围内的线。
  3. 计算给定标签的嵌套空间并将其存储在hold中。
  4. 在循环中双引号标记数据:a
  5. ,在循环中的后面插入嵌套空格:b
  6. 删除模式空间中最后一个换行符之后的所有内容并打印。

结果

[
 {
   "title": "Some Title",
   "tags":["tagA",
           "tag-B",
           "tagC"]
 },
 {
   "title": "Some Title 2",
   "tags":["tagA",
           "tagC"]
 },
 ...
]

相关内容