优化正则表达式提取M3U播放列表tvg-name最后括号内值
提取M3U播放列表
tvg-name字段最后一对括号内的内容 给定示例M3U播放列表:
#EXTM3U #EXTINF:-1 tvg-id="wsoc.us" tvg-name="ABC 9 (Something) (WSOC)" tvg-logo="" group-title="US Locals",ABC 9 (Something) WSOC (WSOC) http://some.url/1 #EXTINF:-1 tvg-id="wbtv.us" tvg-name="CBS 3 WBTV (WBTV)" tvg-logo="" group-title="US Locals",CBS 3 WBTV (WBTV) http://some.url/2 #EXTINF:-1 tvg-id="wcnc.us" tvg-name="NBC (Hey) 36 WCNC (WCNC)" tvg-logo="" group-title="US Locals (Something here)",NBC 36 (Hey) WCNC (WCNC) http://some.url/3 #EXTINF:-1 tvg-id="wjzy.us" tvg-name="FOX 46 WJZY (Shout Out) (WJZY)" tvg-logo="" group-title="US Locals",FOX 46 WJZY (Shout Out) (WJZY) http://some.url/4
需求是提取tvg-name字段中最后一对括号内的内容(如WSOC、WBTV、WCNC等),现有多工具组合命令可行,但可以用更简洁的单工具方案替代:
方案1:仅用Awk(逻辑清晰,推荐)
awk '/tvg-name/{match($0,/tvg-name="[^"]*\(([^)]+)\)"/, arr); print arr[1]}' Playlist.m3u | sort -u
- 原理:通过正则精准匹配
tvg-name字段,直接把最后一对括号内的内容捕获到数组arr的第1位,打印后去重排序。
方案2:仅用Grep(简洁高效)
grep -Po 'tvg-name=".*?\(\K[^)]+(?=\)"[^"]*$)' Playlist.m3u | sort -u
- 原理:借助PCRE特性,
\K忽略前面的匹配内容,(?=\)"[^"]*$)确保目标是tvg-name字段内的最后一对括号,直接提取括号里的文本。
方案3:仅用Sed
sed -n 's/.*tvg-name=".*(\([^)]*\))".*/\1/p' Playlist.m3u | sort -u
- 原理:用正则匹配整行,捕获
tvg-name里最后一对括号内的内容,将整行替换为捕获的内容并打印,最后去重排序。
这些单工具方案减少了管道调用的开销,代码更紧凑,维护性也更强。
内容的提问来源于stack exchange,提问作者Dan Marcoux
相关产品推荐
相关产品推荐

