首页 > 解决方案 > 如何在具有多行的两个方括号之间进行正则表达式?(grep|awk|python)

问题描述

我有这个包含多个 json 对象的文件,并试图抓取数组“ld”中的数据,该数组继续到下一行。有没有办法将第一个锚点“[”和最后一个锚点“]”作为一组,然后将下一个作为另一组?

    {
        "test": 'asdfadfa',\n
        "happy": 'dq34werqedqe',\n
        "ld": [\n
            "creamer",\n
            "sugar",\n
            "honey"\n
        ]
    }
    {
        "test": 'asdfadfa',\n
        "happy": 'dq34werqedqe',\n
        "ld": [\n
            "coffee_creamer",\n
            "milk"
    ]\n
    }
.
.
.

只想要

"creamer", "sugar", "honey"
"coffee_creamer", "milk"

即使使用 [\r\n]+,我也尝试过多次这样做,但无法匹配第一个锚点是问题 '[' 到下一个锚点']'。我尝试了 python,但是我的文件太大而无法解析,而且我的内存一直在崩溃,所以想将正则表达式与 grep/awk 一起使用。如果不是推荐的另一种方式,是否有可能会非常感谢。

标签: awk

解决方案


这种方法很脆弱,我不建议使用它。有一些可用的工具,例如jq,它们旨在处理 json 数据,并且更适合此任务(参见例如https://cameronnokes.com/blog/working-with-json-in-bash-using-jq/更多细节)。

话虽如此,这是使用 awk 的一种潜在方法:

如果“\n”字符是“真实的”:

awk '/"ld":/{flag=1; next} /]/{flag=0} flag' test.json
"creamer",
"sugar",
"honey"
"coffee_creamer",
"milk"

# Tidy up the output
awk '/"ld":/{flag=1; next} /]/{flag=0} flag' test.json | tr -s "\n" " " | sed 's/" "/"\n"/g; s/ //g'
"creamer","sugar","honey"
"coffee_creamer","milk"

如果“\n”字符实际上存在,除了“真正的”换行符:

awk '/"ld":/{flag=1; next} /]/{flag=0} flag' test.json | tr -s "\n" " " | sed 's/\\n//g; s/" "/"\n"/g; s/ //g'
"creamer","sugar","honey"
"coffee_creamer","milk"

推荐阅读