我正在尝试使用sed批量编辑多行M3U文件,其内容如下所示:
#EXTINF:-1 tvg-id="NBC.us" tvg-name="NBC US" tvg-logo="http://example.com/NBC.us.png" tvg-chno="12" group-title="United States",NBC
我想找/替,以便最终得到如下内容:
#EXTINF:-1 tvg-id="NBC.us" tvg-name="NBC" tvg-logo="http://example.com/NBC.us.png" channelid="12" group-title="United States",NBC
换句话说,我需要找到/替换tvg-chno
到channelid
并将字符串从(并且不包括)最后一个,
复制到该行的末尾并使用它来覆盖tvg-name
的内容。我有一个sed命令工作的第一个位和一个破坏的一个不完全按预期工作的第二个如下:
sed -i 's/tvg-chno/channel-id/g' test.m3u
sed -i 's/\(.*tvg-name="\)\(.*"\)\(.*",\)\(.*\)/\1\4\3\4/g' test.m3u
第二个sed命令输出:
#EXTINF:-1 tvg-id="NBC.us" tvg-name="NBCUnited States",NBC
如果可能的话,我希望能够在单行中完成所有变换。
谢谢你的帮助!
为了避免过多地抓取旧值,第二个命令应该是:
's/\(tvg-name="\)\([^"]*\)\(".*",\)\(.*\)/\1\4\3\4/'
要将两个命令合并为一个,只需用分号连接它们:
sed -i 's/.../.../g;s/.../.../' test.m3u
这可能适合你(GNU sed):
sed -r 's/(tvg-name=")[^"]*(".*)tvg-chno(.*,([^,]*))$/\1\4\2channelid\3/' file
字符串上的模式匹配并使用返回引用来实现所需的结果。
注:这假设tvg-chno
将始终遵循tvg-name
,如果没有,将需要两次替换。