【问题标题】:Remove tags from m3u file从 m3u 文件中删除标签
【发布时间】:2021-06-05 03:15:24
【问题描述】:

我有这样提供的 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

我想将 catchup 类型更改为 fs 并删除所有 catchup-source 标签,所以结果应该是:

#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:

sed '/text to remove/d' ./file

在我的情况下,要删除的字符串在 catchup="default"group-title= 之间是不同的,并得到我发布的结果。

【问题讨论】:

  • edit您的问题向我们展示您的尝试:)
  • 其实我知道怎么用sed去掉特定的子串,但是不知道怎么去掉2个词之间的各种子串,所以我的情况比较复杂
  • 没关系!如果我们的代码完美运行,我们就不会在这里 :)
  • 我编辑了问题。不幸的是,我不知道如何得到我想要的

标签: linux bash m3u


【解决方案1】:

像这样:

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

解释:

逐行读取文件,将其拆分为以空格为分隔符的字段并将其存储在数组中。对数组中的每个字段检查内容:如果内容是catchup default thing,则将其更改为catchup=fs thing,如果内容是catchup-source,则继续(':'表示true),否则检查该字段是否有内容(-n),如果它有内容,检查字段的内容是否有换行符,如果它只打印内容,否则打印带有分隔符的空格。

【讨论】:

    【解决方案2】:

    你已经完成了一半。

    sed -i.bak  -E -e 's/catchup="default" /catchup="fs" /g;s/catchup-source=[^ ]+ //g' file
    

    使用搜索和替换部分字符串 s/MATCH/REPLACEMENT/ 是您所需要的(而不是删除匹配行 /MATCH/d)。

    因此,我们搜索 catchup="default" 的每一个字面值并用任何内容替换它catchup-source=[^ ]+ 相同(catchup-source= 后跟不是空格的任何内容,后跟空格 [^ ]+ 。完成。

    我们将其作为一个 infile-replacement -i 并告诉它创建一个备份版本 -i.bak

    【讨论】:

    • 它删除了catchup="default",但应该重命名为catchup="fs"
    • 糟糕。轻松修复。
    猜你喜欢
    • 2021-03-28
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多