"jq"に二重引用符の代わりに一重引用符を使用してjsonを読み取る方法はありますか?

私はこれを大きな入れ子になったファイルを解析する効率的な方法jqとして使います。時には、次のようにキーと値を二重引用符の代わりに一重引用符で囲んだ形式のファイルが必要jsonです。jqjson

{
  'aggs': {
    'two': {
      'composite': {
        'size': 700
       }
     }
  }
}

これは実際の形式とは見なされませんが、jsonjqにこのファイルを読み取るために設定できるパラメータがあるかどうか疑問に思います。それ以外の場合、このファイルは読み取れません。

そうでない場合は、Linuxですべての単一引用符を二重引用符に置き換えて読み取ることができる最も効率的な方法は何ですか?jq

ベストアンサー1

通常、キーまたは文字列に一重引用符を使用することは破壊的です。JSON形式の仕様しかし、私たちは文書をリテラル(二重引用符で囲まれた)文字列を含むYAML文書として解釈することができます。

マイクパラyqこれをYAML(下記の注意事項を含む)に解析して標準JSONに変換できます。

$ yq -oj eval . file
{
  "aggs": {
    "two": {
      "composite": {
        "size": 700
      }
    }
  }
}

'1"2'正しく変換されますが"1\"2"処理されません'1\'2'(エラーが発生しますが、その文字列はYAMLでも無効な文字列なので、これは驚くべきことではありません)。バックスラッシュは一重引用符で囲まれたYAML文字列の'1\"2'リテラルなので"1\\\"2"

\nバックスラッシュはリテラルバックスラッシュなので、他のエンコードされた値を含む文字列(たとえば、エンコードされたリテラルの改行またはエンコードされたリテラルタブ)では、目的の操作を実行できない可能性があります。平和\tのために別々に変換してください。\\n\\t

アンドレイ・キースリュークyq(これはのラッパーですjq) Mikeのものと同じ制限事項と注意事項があるようですyq

$ yq . file
{
  "aggs": {
    "two": {
      "composite": {
        "size": 700
      }
    }
  }
}

スティーブン・レビンyj、YAMLからJSONにデータを変換するためにも使用できます。

$ yj <file
{"aggs":{"two":{"composite":{"size":700}}}}

おすすめ記事