我需要有关一个简单的脚本的帮助,但我得到的结果将变量加了 2 而不是 1。我可以得到一些帮助,以便它只有 1 吗?
var=1
while read -r LINE || [ -n "$LINE" ]; do
LINE=`echo $LINE | sed -e "s/EXTINF:-1/& tvg-chno=\"$var\"/"`
echo $LINE >> emby_iptv_tmp.m3u
var=$((var + 1))
这是我得到的输出,我希望通道为 1,2,3,4
#EXTM3U
#EXTINF:-1 tvg-chno="2" tvg-ID="" tvg-name="AU: Fox NRL League HD" tvg-logo="" group-title="Sports",AU: Fox NRL League HD
http://.m3u8
#EXTINF:-1 tvg-chno="4" tvg-ID="Ginx Esports CA" tvg-name="CA: Ginx Esports TV" tvg-logo="https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/GINX_Esports_TV_Logo.png/200px-GINX_Esports_TV_Logo.png" group-title="General Streams",CA: Ginx Esports TV
http://.m3u8
#EXTINF:-1 tvg-chno="6" tvg-ID="Golf Channel CA" tvg-name="CA: Golf Channel UHD" tvg-logo="http://cdn.cablefax.com/wp-content/uploads/2014/06/golf-logo.jpg" group-title="Sports",CA: Golf Channel UHD
http://.m3u8
1.“工作脚本”
#!/bin/sh
: > emby_iptv.m3u
wget "Account login" -O iptv_download.m3u
var=1
while read -r LINE || [ -n "$LINE" ]; do
LINE=`echo $LINE | sed -e "s/EXTINF:-1/& tvg-chno=\"$var\"/"`
echo $LINE >> emby_iptv_tmp.m3u
var=$((var + 1))
done < iptv_download.m3u
cp emby_iptv_tmp.m3u emby_iptv.m3u
rm emby_iptv_tmp.m3u
短暂性脑缺血发作
答案1
您为每一行添加 1 $var
,但仅当匹配时才这样做EXTINF:-1
:
使用如下方法跳过不匹配的行:
while read ...; do
[[ "$LINE" =~ EXTINF:-1 ]] || continue
...
<other commands>
done < iptv_download.m3u
一些额外的提示:
- 您可以直接运行 ,而
cp file.tmp file
不是。rm file.tmp
mv file.tmp file
- 使用
$(...)
它来代替被认为已弃用的反引号。
答案2
您将var
在循环的每次迭代中增加它,因此在文件中的每一行也是如此。如果您只想为包含的每一行增加它EXTINF:-1
,则可以使用 AWK 处理整个文件并删除 while 循环:
awk '/#EXTINF:-1/ {gsub(/EXTINF:-1/, "& tvg-chno=\"" ++channel "\"")} 1' iptv_download.m3u > emby_iptv_tmp.m3u
此处的变量channel
保存了频道号,并且每次在该块中都会递增,该块仅在匹配的行上运行#EXTINF:-1
。