一部のKey-Valueペアを返すJSON文字列がありますが、値が数値の場合は二重引用符で囲まれていないため、JSON解析は機能しません。
私の考えは、以下を除くすべての項目を検索して置き換えて文字列を操作することです。:
開く中:"
かっこ{
また、末尾で二重引用符を閉じる必要があるため、0〜9の後にカンマが続くことを見つけて、そのコンマを次に置き換える方法を見つける必要があります。",
"{
検索/交換にはSEDが必要だと思いますが、SEDとRegExに初めて触れたので、始める方法、特に見つけた場所を省略し、RegExを使って見つける方法がわかりません。[0-9],
サンプルJSON文字列は次のとおりです。
{"data":{"project":{"issue":{"session":{"id":"625fdv6b95e232f08d6cy2686624f315","createdAt":1539849060000,"buildVersionId":"75492373","sdk":{"display":"1.11.1"},"os":{"platform":"unknown","modified":false},"memory":{"free":853000192,"used":1896611840},"storage":{"free":241791528960,"used":14197940224},"device":{"architecture":"arm64","manufacturer":"Samsung"}}}}}}
変更後に必要な完了JSONは次のとおりです。
{"data":{"project":{"issue":{"session":{"id":"625fdv6b95e232f08d6cy2686624f315","createdAt":"1539849060000","buildVersionId":"75492373","sdk":{"display":"1.11.1"},"os":{"platform":"unknown","modified":false},"memory":{"free":"853000192","used":"1896611840"},"storage":{"free":"241791528960","used":"14197940224"},"device":{"architecture":"arm64","manufacturer":"Samsung"}}}}}}
ほぼ同じですが、各数値に二重引用符があります。
答え1
どうですか?
sed 's/:\([0-9]*\)\([,}]\)/:"\1"\2/g' inp >out
s/:\([0-9]*\)\([,}]\)
-:
数字の後に,
またはを入力して検索します}
。キャプチャ\1に数字を入れ、\2に,
orを}
入れます。/:"\1"\2/g
- 次に置き換えて、:"
\ 1(数字)をキャプチャしてからにキャプチャしてから、"
\ 2(元のサフィックス文字)をキャプチャします。
はい
$ cat inp
{"data":{"project":{"issue":{"session":{"id":"625fdv6b95e232f08d6cy2686624f315","createdAt":1539849060000,"buildVersionId":"75492373","sdk":{"display":"1.11.1"},"os":{"platform":"unknown","modified":false},"memory":{"free":853000192,"used":1896611840},"storage":{"free":241791528960,"used":14197940224},"device":{"architecture":"arm64","manufacturer":"Samsung"}}}}}}
$ sed 's/:\([0-9]*\)\([,}]\)/:"\1"\2/g' inp >out
$ cat desired
{"data":{"project":{"issue":{"session":{"id":"625fdv6b95e232f08d6cy2686624f315","createdAt":"1539849060000","buildVersionId":"75492373","sdk":{"display":"1.11.1"},"os":{"platform":"unknown","modified":false},"memory":{"free":"853000192","used":"1896611840"},"storage":{"free":"241791528960","used":"14197940224"},"device":{"architecture":"arm64","manufacturer":"Samsung"}}}}}}
$ diff out desired
$
答え2
私はJSONデータを変更する代わりに二重引用符を見つけるのではなく、数値のgrep操作を次のように変更する別のアプローチを取りました。
buildVersionId=`echo $jsonData | grep -m1 -oP '"buildVersionId"\s*:\s*\K[^"]+"'`
,"
次に、最後の2文字()を削除して実際の数字のみを取得します。
buildVersionId=${buildVersionId::${#buildVersionId}-2}
答え3
jq -c '(.. | select(numbers)) |= tostring' file >newfile
このjq
コマンドは、文書の場所に関係なく、JSON文書内のすべての数値を文字列に変換します。
出力は「コンパクト」形式でファイルに書き込まれますnewfile
。
何らかの理由でJSONドキュメントをシェル変数に入れる場合は、次のことがdata
できます。
jq -c -n --argjson d "$data" '$d | (.. | select(numbers)) |= tostring' >newfile