如何在多行的两个方括号之间进行正则表达式? (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"
我有一个包含多个 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"