給定以下 JSON:
{
"one": "1",
"two": "2",
"flag": "f1 f2 f3",
"test one": "",
"test two": "",
"test three": ""
}
是否可以使用jq獲得以下結果?
{
"one": "1",
"two": "2",
"flags": ["f1", "f2", "f3"],
"tests": ["one", "two", "three"]
}
三點很關鍵:
保持不變的任何不是
flag或開頭的欄位test將(空格分隔的值)轉換
flag為陣列任何
test以tests_
uj5u.com熱心網友回復:
您可以使用/=通過拆分進行更新,startswith在字串的開頭進行匹配,以及to_entries操作with_entries涉及鍵名的條目:
jq '
.flag /= " "
| .tests = (to_entries | map(.key | select(startswith("test "))[5:]))
| with_entries(select(.key | startswith("test ") | not))
'
演示
另一個可能更有效的實作,它只在物件中回圈一次,reduce可能是:
jq '
reduce to_entries[] as {$key, $value} (null;
if $key == "flag" then .flag = $value / " "
elif $key | startswith("test ") then .tests = [$key[5:]]
else .[$key] = $value end
)
'
演示
給定樣本資料,兩者都產生:
{
"one": "1",
"two": "2",
"flag": [
"f1",
"f2",
"f3"
],
"tests": [
"one",
"two",
"three"
]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/461074.html
上一篇:字符陣列的奇怪行為
