我正在尝试用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
换句话说,我需要查找/替换channelid
的tvg-chno
,并将字符串从(不包括)最后一个,
复制到行尾,并使用它覆盖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
如果可能的话,我希望能够在一行程序中完成所有的转换。
感谢您的帮助!
发布于 2018-05-29 08:46:54
为了避免获取过多的旧值,第二个命令应该是:
's/\(tvg-name="\)\([^"]*\)\(".*",\)\(.*\)/\1\4\3\4/'
要将这两个命令合并为一个命令,只需使用分号将它们连接起来:
sed -i 's/.../.../g;s/.../.../' test.m3u
发布于 2018-05-29 15:15:22
这可能适用于您(GNU sed):
sed -r 's/(tvg-name=")[^"]*(".*)tvg-chno(.*,([^,]*))$/\1\4\2channelid\3/' file
在字符串上进行模式匹配,并使用反向引用来实现所需的结果。
注意:这假设tvg-chno
将始终跟随tvg-name
,如果不是,将需要两次替换。
https://stackoverflow.com/questions/50574739
复制相似问题