Jq EOFの数値リテラルが無効です。

Jq EOFの数値リテラルが無効です。

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"
        }
      }
    }
  }
}

関連情報