You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 06:18:01