0

概要

3 つの異なる名前ペイロードオブジェクトを正しく解析し、それらを目的の出力形式に変換する作業中のjqフィルターがあります。問題は、オブジェクト識別子内で代替を表現する方法を見つけることができないため、各オブジェクト パスを明示的に表現する必要があることです。

フィルターをより柔軟にして、データ構造をcontainers下からタイトルがPackages. ただし、ターミナル ノードだけでなく、構造全体が必要です。

私が必要だと思うのは、次のように、オブジェクト識別子を交互またはワイルドカードで表現することです。

  • .capabilities.*.payload?
  • .capabilities.([apk, dpkg, rpm]).payload?

上記のどちらも有効なjq構文ではないことを認識しています。これが質問の理由です。すぐ下に有効な JSON を含むテスト コーパスを含めました。現在の jq フィルターはその下のセクションにリストされています。

最小限の JSON ファイル

これは私のテスト コーパスで、現在のディレクトリにminimum.jsonとして保存されています。

{
  "containers": {
    "3dc76c82e566a116e5b64bc91a0b6220c71db7052f68317ebbe90521db55bf36": {
      "container_name": "/apache-46869",
      "capabilities": {
        "apk": {
          "title": "Packages (APK)"
        },
        "dpkg": {
          "title": "Packages (DPKG)",
          "payload": {
            "apt": "1.0.9.8.4",
            "libnghttp2-14": "1.18.1-1"
          }
        },
        "rpm": {
          "title": "Packages (RPM)"
        }
      }
    },
    "474047a1fe238e39fa1917aff0c93154624bbf159d321d49d5e685302589ab51": {
      "container_name": "/nginx-alpine-46869",
      "capabilities": {
        "apk": {
          "title": "Packages (APK)",
          "payload": {
            ".nginx-rundeps": "0",
            "apk-tools": "2.6.8-r2"
          }
        },
        "dpkg": {
          "title": "Packages (DPKG)"
        },
        "rpm": {
          "title": "Packages (RPM)"
        }
      }
    },
    "d7dcd90791240d78022941cf054a6b474f5329acd79aa15b58dc342f95a8ce33": {
      "container_name": "/apache-alpine-46869",
      "capabilities": {
        "apk": {
          "title": "Packages (APK)",
          "payload": {
            ".httpd-rundeps": "0",
            "apk-tools": "2.6.8-r2",
            "apr": "1.5.2-r1",
            "apr-util": "1.5.4-r2"
          }
        },
        "dpkg": {
          "title": "Packages (DPKG)"
        },
        "rpm": {
          "title": "Packages (RPM)"
        }
      }
    }
  }
}

明示的な jq フィルター

これは私の現在のフィルターです。これは機能しますが、オプションの各オブジェクト indentifier-indexを明示的に定義します。

jq '
    [ .containers[] | { 
        name: .container_name, package_inventory: {
            apk: .capabilities.apk.payload?,
            dpkg: .capabilities.dpkg.payload?,
            rpm: .capabilities.rpm.payload?
        }   
    }]  
' minimal.json

期待される出力

現在の出力 (以下を参照) は正しいです。目標は出力を修正することではなく、フィルターをより柔軟にすることです。

[
  {
    "name": "/apache-46869",
    "package_inventory": {
      "apk": null,
      "dpkg": {
        "apt": "1.0.9.8.4",
        "libnghttp2-14": "1.18.1-1"
      },
      "rpm": null
    }
  },
  {
    "name": "/nginx-alpine-46869",
    "package_inventory": {
      "apk": {
        ".nginx-rundeps": "0",
        "apk-tools": "2.6.8-r2"
      },
      "dpkg": null,
      "rpm": null
    }
  },
  {
    "name": "/apache-alpine-46869",
    "package_inventory": {
      "apk": {
        ".httpd-rundeps": "0",
        "apk-tools": "2.6.8-r2",
        "apr": "1.5.2-r1",
        "apr-util": "1.5.4-r2"
      },
      "dpkg": null,
      "rpm": null
    }
  }
]
4

2 に答える 2