私は巨大な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
組み合わせは、Vd
1 行ずつ削除するために使用されます。これはJSONパーサーほど強力ではありませんが、各"blah1"
セクションが独自の行セットに含まれていると仮定することができるため、行ごとに削除しても誤って他のブロックに属する項目は削除されません。たとえば、次のような場合、1行ずつ削除する方法は機能しません。
... end of block you want to keep
}, "blah1" : {
block you want removed
}, "blah2" : {
start of block you want to keep ...
}
また、[{
直接親ブロックのみを使用するため、より多くのネストレベルがある場合は機能しません。