vimを使用してjsonから大きなチャンクを削除する

vimを使用してjsonから大きなチャンクを削除する

私は巨大なjsonファイル(50万行)を持っています。

特定の文字列を含む項目セットを削除する必要があります。

{
    "bla1": {
        "Part1": "Plop1",
        "Part2": "Plop2",
        "Part3": "BadFling1<stuff>",
        "part4": "Plop4",
    },
    "bla2": {
        "Part1": "Plop1",
        "Part2": "Plop2",
        "Part3": "<stuff>",
        "part4": "Plop4",
    },
    // etc for many more entries
}

すべてのアイテムには、「Part3」アイテムの前に「BadFling1」が付いています。

「BadFling1」を含むすべてのアイテムを自動的に削除する最良の方法を知りたいです。たとえば、上記から誤った項目を削除した結果は次のとおりです。

{
    "bla2": {
        "Part1": "Plop1",
        "Part2": "Plop2",
        "Part3": "<stuff>",
        "part4": "Plop4",
    },
    // etc for many more entries
}

最初の試みは成功しましたが、十分に高速ではありませんでした(少し手作業でしたので)。

/BadFling1
qan3k5ddq
:map z n@a

今「z」キーを押し続けます。

私のvim fooが十分に強力ではないので、vimでプロセスをよりよく自動化する方法がわかりません。助けてくれてありがとう。

Bashの代替案(他のコマンドラインツールも歓迎します)。

ベストアンサー1

この試みvim

:g/BadFling/normal [{V]}d

これにより、:globalパターンに一致するすべての行でコマンドが実行されます(BadFling例として使用しました。必要に応じて調整します)。この場合、実行されるコマンドは通常:normalモードコマンドを実行するコマンドと同じです。これの目的は、角かっこペア間の移動および移動コマンド機能を利用することです[{。 is の]} vim組み合わせは、Vd1 行ずつ削除するために使用されます。これはJSONパーサーほど強力ではありませんが、各"blah1"セクションが独自の行セットに含まれていると仮定することができるため、行ごとに削除しても誤って他のブロックに属する項目は削除されません。たとえば、次のような場合、1行ずつ削除する方法は機能しません。

    ... end of block you want to keep
}, "blah1" : {
    block you want removed
}, "blah2" : {
    start of block you want to keep ...
}

また、[{直接親ブロックのみを使用するため、より多くのネストレベルがある場合は機能しません。

おすすめ記事