Bash
使用 jq 將 JSON 對象添加到數組
我的目標是使用bash
jq
中命令的輸出輸出 JSON 對象。find
它可以是單行命令或 bash 腳本。我有這個命令,它從每一行輸出創建 JSON 對象:
find ~/ -maxdepth 1 -name "D*" | \ while read line; \ do jq -n \ --arg name "$(basename "$line")" \ --arg path "$line" \ '{name: $name, path: $path}'; \ done
輸出如下所示:
{ "name": "Desktop", "path": "/Users/username/Desktop" } { "name": "Documents", "path": "/Users/username/Documents" } { "name": "Downloads", "path": "/Users/username/Downloads" }
但我需要將這些對象放在一個數組中,並且我需要該數組是父對象的單個鍵的值,稱為
items
,如下所示:{"items": [ { "name": "Desktop", "path": "/Users/username/Desktop" }, { "name": "Documents", "path": "/Users/username/Documents" }, { "name": "Downloads", "path": "/Users/username/Downloads" } ] }
我嘗試將方括號添加到
jq
每行 ( ) 的輸出字元串中,'[{name: $name, path: $path}]';
並添加方括號,但不添加數組元素之間的逗號。我在這裡找到了可能的解決方案,但在遍歷每一行時我無法弄清楚如何使用它們。
流過濾器的這個技巧
jq 1.5
inputs
似乎可以做到... | jq -n '.items |= [inputs]'
前任。
$ find ~/ -maxdepth 1 -name "D*" | while read line; do jq -n --arg name "$(basename "$line")" --arg path "$line" '{name: $name, path: $path}' done | jq -n '.items |= [inputs]' { "items": [ { "name": "Downloads", "path": "/home/steeldriver/Downloads" }, { "name": "Desktop", "path": "/home/steeldriver/Desktop" }, { "name": "Documents", "path": "/home/steeldriver/Documents" } ] }
如果您不介意使用程式語言,這很簡單。這是一個使用 PHP 的範例:
<?php $m1 = [ 'items' => [] ]; $a1 = glob('~/D*'); foreach ($a1 as $s1) { $m1['items'][] = [ 'name' => basename($s1), 'path' => $s1 ]; } echo json_encode($m1, JSON_PRETTY_PRINT);