如何在多行的两个方括号之间进行正则表达式? (grep|awk|python)

How to regex between two square brackets with multiple lines? (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 一起使用。 有没有可能,如果不是推荐的另一种方式会非常感谢。

这种方法很脆弱,我不建议使用它。有可用的工具,例如 jq which are designed to handle json data, and would be more appropriate for this task (see e.g. https://cameronnokes.com/blog/working-with-json-in-bash-using-jq/ 了解更多详情)。

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

如果"\n"字符是'real':

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”字符实际存在,除了 'real' 换行符:

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"