YAMLファイルから特定のヘッダーの特定のサブセクションをすべて削除する方法は?

YAMLファイルから特定のヘッダーの特定のサブセクションをすべて削除する方法は?

私はbashシェルを使用しています。特定のテキストブロックを削除したいYAMLファイルがあります。

  /image-content:
    post:
      operationId: createEventPublic
      summary: Process events
      description: Process events
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Content'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Content'
  /text-content:
    post:
      operationId: createStaticText
      summary: Process text events
      description: Process text events
      parameters: []
      requestBody:
    ...

たとえば、パスに「イメージコンテンツ」を含むテキストブロックを削除したいとします。通常、この機能を使用して、そのテキストを含む1行を削除できます。

sed -i '/image-content/d' ./infile

しかし、次の行が2つのスペースと「/」(例: "/")で始まるまで、それ以降のすべての行をどのように変更するのかわかりません。上記の場合まですべてを削除したいと思います。

  /text-content:

編集する:これは有効なopenapi 3 swaggerではないかもしれませんが、それでもまだ有効なYAMLファイルだと思います。

openapi: 3.0.0
components:
  /static/image-content:
    post:
      type: hello
  /api/hello:
    post:
      type: hello
  /static/css-content:
    post:
      type: hello

最終的に「/static」で始まるブロックを削除したいと思います。したがって、最終文書は次のようになります。

openapi: 3.0.0
components:
  /api/hello:
    post:
      type: hello

ベストアンサー1

yq -y 'del(."/image-content")' file.yml

これはyq以下で使用されます。https://kislyuk.github.io/yq//image-contentYAML文書から最上位セクションを削除するには、次のコマンドを使用しますdel()

質問のサンプル文書をそのまま考慮すると、次のYAML文書が端末に書き込まれます。

/text-content:
  post:
    operationId: createStaticText
    summary: Process text events
    description: Process text events
    parameters: []
    requestBody: null

保存するには、新しいファイルにリダイレクトするか、その--in-placeオプションを使用してその場所で編集します(もちろん、まずオプションなしでテストした後)。

yqjq式を使用してjqYAMLファイルを処理できるようにするJSONパーサーのラッパーです。


その文書が次のような場合部分の実際の構造を表示しない場合(2つのインデントスペースは2番目のレベルセクションが表示されることを意味します)、次のものを使用できます。

yq -y 'del(.[]."/image-content")' file.yml

この.[]."/image-content"表現は「/image-content最上層の下のすべて」を表します。

到着再帰的/image-contentセクションが文書のどこに表示されているかを検索して削除するには、次を使用します。

yq -y 'del(.. | ."/image-content"?)' file.yml

で使用された式はdel()ドキュメント構造を再帰的に検索し、名前付きセクションを含むすべてのセクションを..抽出します(これはXPathクエリの演算子に対応します)。その後、その内容を削除します。/image-content//


更新された質問を解決するには:

yq -y '.components |= with_entries(del(select(.key | startswith("/static/"))) // empty)' file.yml

componentsその後、サブセクションを取得し、一時的に個々のkey合計value値に変換し(マニュアルのドキュメントwith_entries()を参照jq)、キーが正しい文字列で始まるセクションを選択および削除してセクションを更新します/static/

bit // empty:del()演算の結果がnull値です。これらはkeyvalueからvalue適切なバーに戻すことはできないため、emptyvalueに変更して完全に消えました。正直なところ、私はこのことの内部動作について完全にはわかりません。

これにより

openapi: 3.0.0
components:
  /api/hello:
    post:
      type: hello

おすすめ記事