json - 使用 jq 删除 JSON 结构中的选择元素
问题描述
我想删除与搜索条件匹配的 JSON 文件中的某些元素,同时保留 JSON 结构的其余部分。我希望匹配和删除的元素是 .chapter 数组中的一个对象 - .tags.title 包含文本 #MKR#
我知道如何使用以下方法选择正确的元素:
jq -r '.chapters[] | select(.tags.title | contains("#MKR#"))' metadata.json
但不知道如何选择和删除这些元素,同时保持结构的其余部分完好无损。
示例输入 JSON - metadata.json:
{
"chapters": [
{
"id": 0,
"time_base": "1/3000",
"start": 0,
"start_time": "0.000000",
"end": 9200,
"end_time": "3.066667",
"tags": {
"title": "Start"
}
},
{
"id": 1,
"time_base": "1/3000",
"start": 9200,
"start_time": "3.066667",
"end": 15000,
"end_time": "5.000000",
"tags": {
"title": "Example(1) #MKR#"
}
},
{
"id": 2,
"time_base": "1/3000",
"start": 15000,
"start_time": "5.000000",
"end": 18900,
"end_time": "6.300000",
"tags": {
"title": "Example(2)"
}
},
{
"id": 3,
"time_base": "1/3000",
"start": 18900,
"start_time": "6.300000",
"end": 124299,
"end_time": "41.433000",
"tags": {
"title": "Example(3) #MKR#"
}
},
{
"id": 4,
"time_base": "1/3000",
"start": 124299,
"start_time": "41.433000",
"end": 225700,
"end_time": "75.233333",
"tags": {
"title": "Example(4) #MKR#"
}
},
{
"id": 5,
"time_base": "1/3000",
"start": 225700,
"start_time": "75.233333",
"end": 231900,
"end_time": "77.300000",
"tags": {
"title": "Example(5) #MKR#"
}
}
],
"format": {
"filename": "video_mkr_temp.mp4",
"nb_streams": 3,
"nb_programs": 0,
"format_name": "mov,mp4,m4a,3gp,3g2,mj2",
"format_long_name": "QuickTime / MOV",
"start_time": "0.000000",
"duration": "968.300000",
"size": "399977859",
"bit_rate": "3304577",
"probe_score": 100,
"tags": {
"major_brand": "mp42",
"minor_version": "512",
"compatible_brands": "isomiso2avc1mp41",
"creation_time": "2020-04-12T00:46:21.000000Z"
}
}
}
我想要实现的示例输出 JSON:
{
"chapters": [
{
"id": 0,
"time_base": "1/3000",
"start": 0,
"start_time": "0.000000",
"end": 9200,
"end_time": "3.066667",
"tags": {
"title": "Start"
}
},
{
"id": 2,
"time_base": "1/3000",
"start": 15000,
"start_time": "5.000000",
"end": 18900,
"end_time": "6.300000",
"tags": {
"title": "Example(2)"
}
},
],
"format": {
"filename": "video_mkr_temp.mp4",
"nb_streams": 3,
"nb_programs": 0,
"format_name": "mov,mp4,m4a,3gp,3g2,mj2",
"format_long_name": "QuickTime / MOV",
"start_time": "0.000000",
"duration": "968.300000",
"size": "399977859",
"bit_rate": "3304577",
"probe_score": 100,
"tags": {
"major_brand": "mp42",
"minor_version": "512",
"compatible_brands": "isomiso2avc1mp41",
"creation_time": "2020-04-12T00:46:21.000000Z"
}
}
}
任何想法都非常感谢。
谢谢
解决方案
您可以使用以下内容过滤掉您的章节:
jq '.chapters |= map(select(.tags.title | contains("#MKR#") | not))' metadata.json
该-r
选项仅在过滤器输出为字符串时才有用,而此处为 json 对象。
推荐阅读
- java - Android 中的 Message.obtain()
- ios - 当应用程序在iOS swift中关闭时如何将推送通知数据保存到本地数据库中
- typescript - 如何在接口内声明/重用类型
- regex - 正则表达式以任意顺序匹配另一个字符串中的字符
- ruby-on-rails - 如何在 rspec 测试中访问实例变量
- sitecore-form - 将表单字段映射到联系方式
- reactjs - 在 react native 上安装 facebook SDK
- r - 如何根据列表中至少 5 次中有 2 次具有相应信息的列来确定组关联?
- reactjs - 您应该如何使用共享导航组件构建路线?
- vim - 使用 vim 打开目录时,为什么尝试用鼠标选择文本会出现错误“E21:无法进行更改,'modifiable' 已关闭”?