Json

將字元串欄位拆分為jq中的數組?

  • May 5, 2020

我有一個從 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

在職的

  1. 我們選擇{下一}行的範圍。
  2. "tags"在所選範圍內線上放大。
  3. 計算給定標籤的嵌套空間並將其儲存在保持中。
  4. 在循環中雙引號標記數據:a
  5. ,在循環之後插入嵌套空格:b
  6. 刪除模式空間中最後一個換行符之後的所有內容並列印。

結果

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

引用自:https://unix.stackexchange.com/questions/370306