我用的是jq 1.7
数据
我正在对 yt-dlp 下载的 info.json 进行操作
yt-dlp --write-info-json --skip-download https://www.youtube.com/watch?v=vlIO-7Rpi7c
JQ-任务
- 现在我想删除字幕中名称不是的所有数组
de
,en-US
并在其中de
选择en-US
所有带有 element 的对象ext == vtt
。
这成功地工作如下:
jq 'pick(.subtitles | .de[],."en-US"[] | select (.ext == "vtt")) | del(..|nulls)' *.json
输出
{
"subtitles": {
"de": [
{
"ext": "vtt",
"url": "https://www.youtube.com/api/timedtext?v=vlIO-7Rpi7c&ei=JS05ZoT2Ftf0i9oP8dy4mAo&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1715048341&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=AB2ECEEABF48D1A16ADC7ACCB8A072D63EE12DCC.5F56904251766FB68624A68FF2BBB57B9CCFFD2F&key=yt8&lang=de&fmt=vtt",
"name": "German"
}
],
"en-US": [
{
"ext": "vtt",
"url": "https://www.youtube.com/api/timedtext?v=vlIO-7Rpi7c&ei=JS05ZoT2Ftf0i9oP8dy4mAo&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1715048341&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=AB2ECEEABF48D1A16ADC7ACCB8A072D63EE12DCC.5F56904251766FB68624A68FF2BBB57B9CCFFD2F&key=yt8&lang=en-US&fmt=vtt",
"name": "English (United States)"
}
]
}
}
问题
对于某些Youtube视频,json文件不包含“en-US”而是包含“en”,而有些则包含de、en、en-US这三个。所以我写了以下内容
jq 'pick(.subtitles | .de[],.en[],."en-US"[] | select (.ext == "vtt")) | del(..|nulls)' *.json
错误
jq: 错误 (at:69): 无法迭代 null (null)
需要帮助
如果 json 文件中并非所有这些语言都存在,如何仅选择 .ext == "vtt" 仅适用于 en、en-US、de 语言?
我会将
pick()
和分开select()
,以便首先选出正确的语言:然后,仅选择数组中具有正确
ext
值的元素,跳过任何null
值:在上面,
map_values()
将把给定的表达式应用于每个键的值(每个键的值是一个数组)。对于,任何逻辑上为false. // empty
的值(例如, )都会被删除。该表达式将删除任何不满足选择标准的数组元素。null
map(select())
一起:
subtitles
如果对象为空或丢失,这也将起作用。要将其他顶级键保留在适当位置并仅修改下面的内容
subtitles
:请注意,它是如何由与上面的表达式相同的基本组件组成的,但是这里我们
subtitles
在原始文档中进行修改,而之前我们在“picked”文档(仅存在其多个键的subtitles
文档)中进行修改。subtitles