jq
私の目標は、bashのコマンド出力を使用してJSONオブジェクトを出力することです。find
1行のコマンドでも 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}]';
)、角括弧を追加しましたが、配列要素間にカンマは追加しませんでした。
可能な解決策を見つけましたここしかし、各行を繰り返しながら使用する方法がわかりません。
ベストアンサー1
この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"
}
]
}