私は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-content
YAML文書から最上位セクションを削除するには、次のコマンドを使用しますdel()
。
質問のサンプル文書をそのまま考慮すると、次のYAML文書が端末に書き込まれます。
/text-content:
post:
operationId: createStaticText
summary: Process text events
description: Process text events
parameters: []
requestBody: null
保存するには、新しいファイルにリダイレクトするか、その--in-place
オプションを使用してその場所で編集します(もちろん、まずオプションなしでテストした後)。
yq
jq
式を使用してjq
YAMLファイルを処理できるようにする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
値です。これらはkey
valueからvalue
適切なバーに戻すことはできないため、empty
valueに変更して完全に消えました。正直なところ、私はこのことの内部動作について完全にはわかりません。
これにより
openapi: 3.0.0
components:
/api/hello:
post:
type: hello