复制文件中的字符串并使用sed覆盖另一个字符串

问题描述 投票:1回答:2

我正在尝试使用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-chnochannelid并将字符串从(并且不包括)最后一个,复制到该行的末尾并使用它来覆盖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

如果可能的话,我希望能够在单行中完成所有变换。

谢谢你的帮助!

regex sed
2个回答
1
投票

为了避免过多地抓取旧值,第二个命令应该是:

's/\(tvg-name="\)\([^"]*\)\(".*",\)\(.*\)/\1\4\3\4/'

要将两个命令合并为一个,只需用分号连接它们:

sed -i 's/.../.../g;s/.../.../' test.m3u

0
投票

这可能适合你(GNU sed):

sed -r 's/(tvg-name=")[^"]*(".*)tvg-chno(.*,([^,]*))$/\1\4\2channelid\3/' file

字符串上的模式匹配并使用返回引用来实现所需的结果。

注:这假设tvg-chno将始终遵循tvg-name,如果没有,将需要两次替换。

© www.soinside.com 2019 - 2024. All rights reserved.