JsonファイルにRaid情報構造の履歴を追加しようとしています。
jq '.raid.c0.e252.s0 +={"device": "/c0/e252/s0"}' file.json
しかし、2つのエラーがあります。
jq: error: Invalid numeric literal at EOF at line 1, column 5 (while parsing '.e252') at <top-level>, line 1:
.raid.c0.e252.s0 +={"device": "/c0/e252/s0"}
jq: error: syntax error, unexpected LITERAL, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.raid.c0.e252.s0 +={"device": "/c0/e252/s0"}
jq: 2 compile errors
いくつかのテストの後、フィールド名に問題があることを理解しました。当然e<number>
受け入れられません。実際には以下を使用してください。
jq '.raid.c0.p252.s0 +={"device": "/c0/e252/s0"}' file.json
または
jq '.raid.c0.eid252.s0 +={"device": "/c0/e252/s0"}' file.json
どちらの場合も、期待される結果が得られます。
{
"raid": {
"c0": {
"eid252": {
"s0": {
"device": "/c0/e252/s0"
}
}
}
}
}
明らかに大きな問題ではありません。どのフィールド名でも使用できますが、デバイス名で/c0/e252/s0
クエリを開始する方が簡単です。.c0.e252.s0
jqバージョンは1.6ですが、公式リポジトリにバージョンを維持したいと思います。
この問題に対する解決策を知っている人はいますか?
ありがとう
答え1
e252
この問題は、値を解析する方法によって発生します。
指数(e252 = 10^252
)として扱われますが、この表記法には先行数字(例えば)が必要です1e252 = 1x10^252
。予期しない書式設定により、「無効な数値リテラル」解析エラーが発生します。
明らかに文字列リテラルを探しているので、e252
目的を達成するには次のものが必要です。
jq '.raid.c0."e252".s0 +={"device": "/c0/e252/s0"}' < file.json
これは作る:
{
"raid": {
"c0": {
"eid252": {
"s0": {
"device": "/c0/e252/s0"
}
},
"e252": {
"s0": {
"device": "/c0/e252/s0"
}
}
}
}
}