Разделить поле жала в массив в jq?

У меня есть массив json, возвращенный из curl, который выглядит так:

[ { "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 как массив в исходных объектах с исходными значениями …

Вы делаете это намного сложнее, чем есть. Просто используйте 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" } ] 

Вы можете попробовать это 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. Вычислите пространства вложенности для данного тега и сохраните его в режиме удержания.
  4. Двойная цитата данных тега в цикле :a
  5. Вставьте вложенные пространства после цикла :b
  6. Удалите все после последней строки в пространстве рисунка и печати.

Результаты

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