Bash配合jq实现M3U标签提取、JSON查询更新及字段修改指南
问题1:现有JSON结构合理性判断
你目前设计的「Channels数组存储频道信息+Third_Party节点存储第三方配置」的结构是完全合理的,典型的可落地结构参考如下:
{ "Channels": [ { "name": "TFX", "category": "影视", "stream_url": "http://xxx/stream.m3u8", "tvg_logo": "http://xxx/logo.png" } ], "Third_Party": { "server_domain": "cdn.xxx.com", "auth_token": "abc123", "proxy_enable": false } }
该结构业务数据和配置数据分层清晰,后续扩展字段不会互相干扰,完全满足播放列表重建的需求。如果你的业务逻辑中频道name为唯一标识,不需要额外调整结构。
问题2:按频道name查询数组索引存入Bash变量
可以通过jq的to_entries将数组转换为带索引的对象集合,筛选后直接提取索引值:
# 替换为你要查询的频道名称 target_name="TFX" # 查询索引,存在则返回对应数字,不存在返回空值 channel_index=$(jq -r --arg name "$target_name" '.Channels | to_entries[] | select(.value.name == $name) | .key' file.json) # 写入前判断即可避免重复 if [ -z "$channel_index" ]; then # 频道不存在,执行追加写入逻辑 echo "频道不存在,可写入" else echo "频道已存在,索引为$channel_index,跳过写入" fi
问题3:未知完整键路径时查找修改字段值
使用jq的递归遍历符..匹配所有层级的节点,结合objects筛选对象类型节点后按条件修改即可,不需要提前知道完整键路径:
# 示例:查找所有包含name=TFX的对象,将其category改为test,不管该对象嵌套在哪个层级 jq '(.. | objects | select(.name == "TFX") | .category) = "test"' file.json
问题4:jq修改后丢失外层结构的修复方案
你原有命令的问题在于:管道符将Channels[]拆分出的单个频道对象传递到后续逻辑,最终仅返回修改后的单个频道对象,丢失了根节点结构。修改为如下写法即可保留完整JSON结构:
# 写法1:使用更新运算符操作Channels数组元素,保留根结构 jq '.Channels[] |= (select(.name == "TFX") | .category = "test")' file.json # 写法2:将赋值逻辑限定为根节点的子操作,直接返回完整根对象 jq '(.Channels[] | select(.name == "TFX").category) = "test"' file.json
如果需要直接修改原文件,jq 1.6及以上版本可添加-i参数,无需额外重定向:jq -i '上述表达式' file.json
内容的提问来源于stack exchange,提问作者Rickey Mandraque
相关产品推荐
相关产品推荐

