jqの正規表現とキーマッチ[閉じる]

jqの正規表現とキーマッチ[閉じる]

jsonfileJSON入力()を解析するスクリプトを作成しています。

  {
   "key11":1010,"key11_yes":13,"key11_no":14,
   "key12":12120,"key12_yes":9,"key12_no":25,
   "key13":12103,"key13_yes":13,"key13_no":20
  }

jq tools次のように値を使用して確認したいと思います。key11key12key13

cat jsonfile | jq 'key[1-9][1-9]'

このパターンは-style正規表現のように機能したいと思いますgrep

cat jsonfile | grep 'key[1-9][1-9]'

一致するキーの値がnullの場合、私のスクリプトはexit 0.

key[1-9]_[this part is null]また、if(つまり、_yesorを追加せずに_no)thenの2番目のパラメータも確認する必要がありますexit 0

ベストアンサー1

jq次の正規表現フィルタtest、、、matchcaptureは生のテキストを入力として使用します。キー名に正規表現を適用するには、まずそのキー名をテキストに変換する必要があります。

jq機能を提供するto_entriesその理由は次のとおりです。

cat jsonfile | jq 'to_entries'

出力:

[
  {
    「キー」:「キー11」、
    "値": 1010
  },
  {
    "キー": "key11_yes",
    "値": 13
  },
  {
    "キー": "key11_no",
    "値": 14
  },
  {
    「キー」:「キー12」、
    "値": 12120
  },
...
]

その後、キーを抽出して正規表現についてテストし、項目全体を出力または無視するフィルタに入力できます。

if (.key|test("key[0-9][0-9]$")) then ( {key: .key, value: .value } ) else empty end

一致from_entries関数は、残りの項目を元の形式に変換し直すか、これらすべてをwith_entries1つのステップで実行できます。

cat jsonfile|jq 'with_entries(if (.key|test("key[0-9][0-9]$")) then ( {key: .key, value: .value } ) else empty end )'

結果は、キーがパターンに一致する入力のすべてのペアです。

{
  "key11": 1010,
  "key12": 12120,
  "key13": 12103
}

おすすめ記事