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

如何用Sed提取匹配模式的首个索引结果?返回值异常修正

问题与解决方法

问题详情

尝试从JSON文件/home/ddd/getaudiomenulist中提取第一个包含Angielski DTS-HD的音频轨道的index值,但现有命令返回2,实际需要获取的是1。

现有命令

AUDIO_LANG=Angielski
cat /home/ddd/getaudiomenulist | sed 's/.*'$AUDIO_LANG' DTS-HD[^:]*:\([^,]*\).*/\1/' | grep -o '[0-9]*$'

目标文件内容

{"success":true,"msg":"","file_path":"","audio_list":[{"name":"1/9 Angielski DTS-HD MA 5.1","index":1,"selected":true},{"name":"2/9 Angielski DTS-HD MA Stereo","index":2,"selected":false},{"name":"3/9 Francuski Dolby Digital","index":3,"selected":false},{"name":"4/9 Niemiecki Dolby Digital","index":4,"selected":false},{"name":"5/9 Włoski Dolby Digital","index":5,"selected":false},{"name":"6/9 Hiszpański Dolby Digital","index":6,"selected":false},{"name":"7/9 Hiszpański Dolby Digital","index":7,"selected":false},{"name":"8/9 Portugalski Dolby Digital","index":8,"selected":false},{"name":"9/9 Angielski Dolby Digital","index":9,"selected":false}]}

问题原因

sed的.*是贪婪匹配,会尽可能匹配最长的符合条件的字符串,因此会定位到最后一个包含Angielski DTS-HD的条目,提取到的是第二个匹配项的index值2。

解决方案

方案1:使用jq处理JSON(推荐)

JSON格式的内容用专门的JSON处理工具jq更可靠,避免依赖字符串结构的脆弱性:

AUDIO_LANG=Angielski
jq -r --arg lang "$AUDIO_LANG" '.audio_list[] | select(.name | contains($lang) and contains("DTS-HD")) | .index' /home/ddd/getaudiomenulist | head -n1
  • 逻辑说明:遍历audio_list数组,筛选出name同时包含指定语言和DTS-HD的条目,输出其index值,最后取第一个结果。

方案2:修复sed命令

如果必须使用sed,需要限制匹配范围避免贪婪:

AUDIO_LANG=Angielski
sed -n 's/.*'"$AUDIO_LANG"' DTS-HD[^}]*"index":\([0-9]*\).*/\1/p' /home/ddd/getaudiomenulist | head -n1
  • 逻辑说明:用[^}]*限制匹配到第一个}之前的内容,确保捕获第一个匹配条目的index,再通过head -n1取第一个结果。

内容的提问来源于stack exchange,提问作者jasko887

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:17:25