使用vim从json中删除大块

Mar*_*ork 4 bash vim

我有一个巨大的 json 文件(1/2 百万行)。

我需要删除一组包含某个字符串的条目。

{
    "bla1": {
        "Part1": "Plop1",
        "Part2": "Plop2",
        "Part3": "BadFling1<stuff>",
        "part4": "Plop4",
    },
    "bla2": {
        "Part1": "Plop1",
        "Part2": "Plop2",
        "Part3": "<stuff>",
        "part4": "Plop4",
    },
    // etc for many more entries
}
Run Code Online (Sandbox Code Playgroud)

所有条目都将“BadFling1”作为“Part3”条目的前缀。

我想知道如何自动删除包含“BadFling1”的所有条目的最佳方法。例如,从上面删除错误条目的结果是:

{
    "bla2": {
        "Part1": "Plop1",
        "Part2": "Plop2",
        "Part3": "<stuff>",
        "part4": "Plop4",
    },
    // etc for many more entries
}
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试工作但不够快(因为它有点手动)。

/BadFling1
qan3k5ddq
:map z n@a
Run Code Online (Sandbox Code Playgroud)

现在按住“z”键。

我的 vim foo 不够强大,所以我不确定如何在 vim 中更好地自动化流程。任何帮助表示赞赏。

bash 中的替代方法(也欢迎其他命令行工具)。

jw0*_*013 7

试试这个vim

:g/BadFling/normal [{V]}d
Run Code Online (Sandbox Code Playgroud)

:global命令在与模式匹配的所有行上运行一个命令(我用作BadFling示例 - 如有必要进行调整)。在这种情况下运行的:normal命令是运行正常模式命令的命令。这样做的目的是使用在支撑对之间移动的[{]} vim移动命令的力量。该Vd是组合体被用来做一个面向删除。这不像 JSON 解析器那样健壮,但假设每个"blah1"部分都包含在它自己的一组行中,因此逐行删除不会意外删除属于另一个块的任何内容。例如,如果您有类似的东西,则逐行删除方法将不起作用

    ... end of block you want to keep
}, "blah1" : {
    block you want removed
}, "blah2" : {
    start of block you want to keep ...
}
Run Code Online (Sandbox Code Playgroud)

此外,[{only 使用直接父块,因此如果您有更多级别的嵌套,它也将不起作用。