awk - 如何在具有多行的两个方括号之间进行正则表达式?(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,它们旨在处理 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"
推荐阅读
- javascript - 在 Android Chrome 中运行 JavaScript 控制台(无电脑)
- python-3.x - discord.py - 停止玩游戏后删除角色
- date - 如何在 PowerBI powerquery 中逐季更改?
- svg - 如何确定在 svg 中绘制的两个形状是否相互重叠?
- java - java调试器不能在可视化音频代码中工作
- javascript - 红点跟随鼠标并在图案周围移动
- python - matplotlib quiver plot 在使用 set_UVC 方法后表现不同
- google-apps-script - 如何让不和谐的机器人从谷歌电子表格中读出一个单元格
- python - Django单元测试:MultipleChoiceField依赖于setUp期间创建的对象
- r - 如何使用 PerformanceAnalytics 计算具有 NA 的等权重投资组合回报?