我需要将频道号添加到 M3U 播放列表文件中。这些通道号通过交互式提示传递给脚本。这一切都有效 90%。
这个想法是脚本将在 M3U 中逐行移动并添加到特定位置。不幸的是,它执行了所有行,但将每个通道号添加到每行,而不是每行一个通道号,到目前为止,我有点迷失了,有什么想法吗?
#!/bin/bash
LISTA="test.m3u"
LINEA_INFO=0
IFS=$'\n'
(
while read LINEA; do
INFO=$(echo "$LINEA" | grep '^#EXTINF:')
if [ "$LINEA_INFO" -eq 0 ] && [ -n "$INFO" ]; then
LINEA_INFO=1
CHANNELNAME=$(echo "$LINEA" | sed 's|.*,||')
echo choose the channel number for $CHANNELNAME
read varnumber < /dev/tty;
echo you chose $varnumber for $CHANNELNAME
fi
if [ "$LINEA_INFO" -eq 1 ] && [ -z "$INFO" ]; then
LINEA_INFO=0
echo "$LINEA" | sed -i -e's/\#EXTINF:-1\>/& tvg-chno="'$varnumber'"/' $LISTA
fi
done < "$LISTA"
)
echo "Done!"
答案1
如果我理解正确的话,shell 脚本应该遍历输入 m3u 文件的每一行,并填写每行交互式请求的通道号。所以,我建议:
#!/bin/bash
InputList="$1"
OutputList="$2"
> "$OutputList"
while IFS= read -r Line; do
if [[ "$Line" =~ ^#EXTINF: ]]; then
echo "choose the channel number for $Line"
read varnumber < /dev/tty
echo "you chose $varnumber for $Line"
Line="${Line%% *} tvg-chno=\"${varnumber}\" ${Line#* }"
fi
echo "$Line" >> "$OutputList"
done < "$InputList"
调用:
$ ./m3u_channels.sh test-1.m3u test-1-ch.m3u
test-1-ch.m3u
它会生成一个插入了通道号的文件。
它是如何工作的?
该程序非常简单。它$InputList
通过循环逐行读取给出的文件while
。read
在每个换行符处停止(默认情况下,如此处所使用)。如果该行以 开头#EXTIF:
,则会提示用户,他们的输入将存储在变量中$varnumber
(从程序复制)。之后,变量$Line
组合在一起为:
${Line%% *}
:字符串的开头$Line
到第一个空格。- 从字面上看,是一个空间。
tvg-chno=\"${varnumber}\"
带有频道号的字符串。- 从字面上看,是一个空间。
${Line#* }
$Line
:从第一个空格开始的字符串。
$Line
然后,无论是否修改,变量的内容都会附加到输出文件中。