Bash
如何用jq進行格式化列印?
jq
具有將數字轉換為字元串或連接字元串的內置功能。如何在 jq 中格式化字元串,
printf
類似於填充(%4s)。例如,如何強制數字佔據 10 個字元空間並左對齊?
echo '{"title" : "A sample name", "number" : 1214}' | jq '(.title) + " " + (.number | tostring)'
一種方法是不嘗試在 中執行此操作
jq
,而是使用jq
輸出 shell 語句在 shell 中執行此操作:eval "$( jq -r -n ' { "title": "A sample name", "number": 1214 } | [ "printf", "%s %10s\\n", .title, .number ] | @sh' )"
或者,
eval "$( printf '%s\n' '{ "title": "A sample name", "number": 1214 }' | jq -r '[ "printf", "%s %10d\\n", .title, .number ] | @sh' )"
或者,
printf '%s\n' '{ "title": "A sample name", "number": 1214 }' | { eval "$( jq -r '[ "printf", "%s %10s\\n", .title, .number ] | @sh' )" }
該
jq
命令將輸出'printf' '%s %10d\n' 'A sample name' 1214
使用
@sh
運算符安全地正確引用命令的每一位。評估時,這將輸出A sample name 1214
類似的方法,但給你兩個變數賦值:
jq -r -n ' { "title": "A sample name", "number": 1214 } | @sh "title=\(.title)", @sh "number=\(.number)"'
然後,您將在腳本中使用這些變數:
unset -v title number eval "$( jq -r -n ' { "title": "A sample name", "number": 1214 } | @sh "title=\(.title)", @sh "number=\(.number)"' )" printf '%s %10s\n' "$title" "$number"
對於已知數據很好的情況(例如,標題不能包含換行符),您可以這樣做
jq -r -n ' { "title": "A sample name", "number": 1214 } | [ .title, .number ] | @sh' | xargs printf '%s %10s\n'
也就是說,確保引用數據,然後將其傳遞給
printf
shell(這將呼叫外部實用程序printf
,而不是內置的 shell)。
jq
沒有printf
。一種方法可能是;部分取自這裡:echo '{"title" : "A sample name", "number" : 1214}' | jq '(.title) + " " + (.number | tostring | (" " * (10 - length)) + .)'
也許更好地添加為模組。
就我個人而言,我很快發現
jq
行有些凌亂,如果做超出基礎的任何事情,就會求助於 perl、python、php 或類似的東西。(但那是我:P)例如用 php:
#! /usr/bin/env php <?php $data = json_decode(file_get_contents("php://stdin")); printf("%s: %10d\n", $data->title, $data->number); ?>
(當然也會添加錯誤檢查等。)