Linux 从m3u文件中删除标记

Linux 从m3u文件中删除标记,linux,bash,m3u,Linux,Bash,M3u,我提供的m3u列表如下所示: #EXTM3U #EXTINF:0 tvg-id="Channel 1" tvg-name="Channel 1" tvg-logo="http://host/logo/logo1.png" timeshift="5" catchup="default" catchup-source="http://1.1.1.1/325/mono-{utc}-{lutc}

我提供的m3u列表如下所示:

#EXTM3U
#EXTINF:0 tvg-id="Channel 1" tvg-name="Channel 1" tvg-logo="http://host/logo/logo1.png" timeshift="5" catchup="default" catchup-source="http://1.1.1.1/325/mono-{utc}-{lutc}.m3u8?token=secret" group-title="Group" ,13 Channel 1
http://2.2.2.2/325/video.m3u8?token=secret
#EXTINF:0 tvg-id="Channel 2" tvg-name="Channel 2" tvg-logo="http://host/logo/logo2.png" timeshift="5" catchup="default" catchup-source="http://1.1.1.1/324/mono-{utc}-{lutc}.m3u8?token=secret" group-title="Group" ,Channel 2
http://2.2.2.2/324/video.m3u8?token=secret
#EXTINF:0 tvg-id="Channel 3" tvg-name="Channel 3" tvg-logo="http://host/logo/logo3.png" timeshift="5" catchup="default" catchup-source="http://1.1.1.1/323/mono-{utc}-{lutc}.m3u8?token=secret" group-title="Group" ,Channel 3
http://2.2.2.2/323/video.m3u8?token=secret
sed '/text to remove/d' ./file
我想将catchup type更改为fs并删除所有catchup源标记,因此结果应该是:

#EXTM3U
#EXTINF:0 tvg-id="Channel 1" tvg-name="Channel 1" tvg-logo="http://host/logo/logo1.png" timeshift="5" catchup="fs" group-title="Group" ,13 Channel 1
http://2.2.2.2/325/video.m3u8?token=secret
#EXTINF:0 tvg-id="Channel 2" tvg-name="Channel 2" tvg-logo="http://host/logo/logo2.png" timeshift="5" catchup="fs" group-title="Group" ,Channel 2
http://2.2.2.2/324/video.m3u8?token=secret
#EXTINF:0 tvg-id="Channel 3" tvg-name="Channel 3" tvg-logo="http://host/logo/logo3.png" timeshift="5" catchup="fs" group-title="Group" ,Channel 3
http://2.2.2.2/323/video.m3u8?token=secret
如何在bash中实现这一点?我试过sed,但没有成功,你能给我指出正确的方向吗

要删除任何特定的子字符串,我可以像这样使用sed:

#EXTM3U
#EXTINF:0 tvg-id="Channel 1" tvg-name="Channel 1" tvg-logo="http://host/logo/logo1.png" timeshift="5" catchup="default" catchup-source="http://1.1.1.1/325/mono-{utc}-{lutc}.m3u8?token=secret" group-title="Group" ,13 Channel 1
http://2.2.2.2/325/video.m3u8?token=secret
#EXTINF:0 tvg-id="Channel 2" tvg-name="Channel 2" tvg-logo="http://host/logo/logo2.png" timeshift="5" catchup="default" catchup-source="http://1.1.1.1/324/mono-{utc}-{lutc}.m3u8?token=secret" group-title="Group" ,Channel 2
http://2.2.2.2/324/video.m3u8?token=secret
#EXTINF:0 tvg-id="Channel 3" tvg-name="Channel 3" tvg-logo="http://host/logo/logo3.png" timeshift="5" catchup="default" catchup-source="http://1.1.1.1/323/mono-{utc}-{lutc}.m3u8?token=secret" group-title="Group" ,Channel 3
http://2.2.2.2/323/video.m3u8?token=secret
sed '/text to remove/d' ./file
在我的例子中,要删除的字符串在
catchup=“default”
组标题=
之间变化,并在我发布时获得结果。

如下所示:

shopt -s extglob ; cat file.txt | while read -r line ; do mapfile -t -d ' ' Line < <(printf '%s' "${line}" | cut -f 1-99 -d ' ') ; for field in "${Line[@]}"; do if [[ "$field" =~ catchup-source=.* ]]; then : ; elif [[ "$field" == catchup=\"default\" ]]; then printf '%s ' 'catchup="fs"'; else [[ -n "$field" ]] && { if [[ "$field" =~ .*$'\n'.* ]]; then printf '%s' "$field" ; else printf '%s ' "$field" ; fi } ; fi; done ; done

shopt-s extglob;cat file.txt |读取时-r行;做mapfile-t-d“行<你已经走到一半了

sed -i.bak  -E -e 's/catchup="default" /catchup="fs" /g;s/catchup-source=[^ ]+ //g' file
您需要使用搜索和替换部分字符串
s/MATCH/REPLACEMENT/
(而不是删除匹配行
/MATCH/d

因此,我们搜索
catchup=“default”
的每一次文本出现,并将其替换为零
/g
(从技术上讲,
g
是不必要的,因为应该只有一次出现
catchup=
s/catchup=“default”//g
,然后对
catchup source=[^]+/code>执行相同的操作(
catchup source=
后跟任何非空格的内容,后跟空格
[^]+
。完成


我们这样做是作为一个infle替换
-i
,并告诉它创建一个备份版本
-i.bak

请您的问题告诉我们您尝试了什么:)事实上,我知道如何用sed删除特定的子字符串,但我不知道如何删除两个单词之间的各种子字符串,所以我的情况更复杂没关系!如果我们的代码工作得很好,我们就不会在这里:)我编辑了这个问题。不幸的是,我不知道如何获得我想要的东西,因为它删除了
catchup=“default”
,但它应该重命名为
catchup=“fs”
Oops。容易解决。