我用的是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 语言?