Json
將字元串欄位拆分為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
作為原始對像中具有原始值的數組…
你讓它變得比現在復雜得多。只需使用
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
如下:下面的程式碼使用的是 sed 的 GNU 版本(儘管它也可以用 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"
在所選範圍內線上放大。- 計算給定標籤的嵌套空間並將其儲存在保持中。
- 在循環中雙引號標記數據
:a
,
在循環之後插入嵌套空格:b
- 刪除模式空間中最後一個換行符之後的所有內容並列印。
結果
[ { "title": "Some Title", "tags":["tagA", "tag-B", "tagC"] }, { "title": "Some Title 2", "tags":["tagA", "tagC"] }, ... ]