我有一个M3 U播放列表,看起来像这样:
#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等。
这是可行的:
grep -Po 'tvg-name=\".*?\"' Playlist.m3u | awk -F'(' '{print $NF}' | cut -f1 -d")" | sort -u
但我知道一定有比使用grep,awk和cut更好的方法。我都快疯了。
6条答案
按热度按时间31moq8wy1#
只使用
GNU
grep
的正则表达式:正则表达式匹配如下:
tvg-name
.*
\(
\K
K
ept)作为使用回头Assert的更短替代方案:look arounds和Support of K in regex\w+
(?=
\)
)
或者使用a proper m3u parser:
需要安装
CPAN
模块:
这具有以可靠的方式可重复用于其他用例的优点,这不是随机
awk
、sed
等的情况。..输出:
nle07wnf2#
GNU
awk
使用(
和)
作为字段分隔符,并在包含tvg-name
倒数第二个字段($(NF-1)
)的每一行中打印。输出:
daolsyd03#
您可以使用
(
和)
字段分隔符,因此不需要最后一个cut
。在单引号字符串中不需要转义双引号。
如果您使用的是GNU
awk
,您还可以使用捕获组来获取tvg-name=".*"
部分,因此您不需要grep
。参见AWK: Access captured group from line pattern
dddzy1tm4#
使用您显示的示例和尝试,请尝试以下
awk
代码。应该可以在任何POSIXawk
版本中工作。这里使用match
函数和substr
功能。使用正则表达式tvg-name=".*\([^)]*
匹配值,并只输出所需的值。rkue9o1l5#
在每个Unix机器上的任何shell中使用任何sed:
9vw9lbht6#
你可以用非常复杂的
perl
或sed
方法来实现,包括捕获组、预测和边界Assert等等,或者你可以用
awk
的方式来做:如果您绝对确定没有任何东西超出最终
)
,那么更简洁:如果你只修改
regex
一点点,你甚至可以得到广播网络。..#
)改成(+
)。..