Jq
是否可以使用 jq 從管道創建 JSON 字元串?
假設我使用該命令
find "$HOME" -maxdepth 1 -type d
,我得到以下結果:/home/user/folder1 /home/user/folder2 /home/user/folder3 /home/user/folder4
我想
jq
在管道上使用並創建不同的 JSON 行,如下所示:{ "path": "/home/user/folder1", "type":"directory"} { "path": "/home/user/folder2", "type":"directory"} { "path": "/home/user/folder3", "type":"directory"} { "path": "/home/user/folder4", "type":"directory"}
jq
我希望通過避免將這個文件夾列表放在一個數組中並在循環中一個一個地創建它們來解決它。在虛擬碼中,這個想法是:find "$HOME" -maxdepth 1 -type d | jq '.logic-to-create-json-strings'
有可能
jq
嗎?
此答案假定您的文件名(或您希望 JSON 編碼的任何文本)是有效的 UTF-8。
兩種選擇:
不使用
xargs
:直接從with呼叫jq
路徑名作為位置參數。讀取找到的路徑名,並將它們作為表達式中的數組訪問。對於每個路徑名,創建一個 JSON 對象。find``-exec``--args``$ARGS.positional[]``jq
find "$HOME" -maxdepth 1 -type d \ -exec jq -n -c '$ARGS.positional[] as $path | { path: $path, type: "directory" }' --args {} +
使用
xargs
:使用-print0
withfind
和-0
withxargs
將找到的路徑名從find
to安全傳遞xargs
。該jq
表達式與上述相同,只是路徑名之間傳遞的方式find
不同jq
。find "$HOME" -maxdepth 1 -type d -print0 | xargs -0 jq -n -c '$ARGS.positional[] as $path | { path: $path, type: "directory" }' --args
使用上述兩種方法,
jq
將對找到的路徑名進行編碼,以便能夠將它們表示為 JSON 字元串。要將行讀取到您顯示的一組對像中,您可以使用以下
jq
命令,該命令從其標準輸入流中讀取:jq -R -c '{ path: ., type: "directory" }'