M3Uプレイリストにチャンネル番号を追加

M3Uプレイリストにチャンネル番号を追加

M3Uプレイリストファイルにチャンネル番号を追加する必要があります。これらのチャネル番号は、対話型プロンプトを介してスクリプトに渡されます。すべて90%効果的です。

アイデアは、スクリプトがM3Uで1行ずつ移動され、特定の場所に追加されることです。残念ながら、すべての行を実行しますが、行ごとに1つのチャネル番号の代わりに各行に各チャネル番号を追加します。これまで少し失いました。アイデアはありますか?

#!/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

私が正しく理解した場合、シェルスクリプトは入力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ループを介して与えられたファイルを1行ずつ読みますwhilereadすべての改行で停止します(デフォルト、ここで使用されます)。行が始まると、ユーザーにメッセージが表示され、その入力は変数(プログラムからコピー)#EXTIF:に保存されます。$varnumberその後、変数は次$Lineのように結合されます。

  1. ${Line%% *}:文字列の先頭から$Line最初のスペースまで。
  2. 文字通りスペース。
  3. tvg-chno=\"${varnumber}\"チャンネル番号を含む文字列。
  4. 文字通りスペース。
  5. ${Line#* }$Line: 最初のスペースから始まる文字列です。

$Lineこれにより、変更の有無にかかわらず、変数の内容が出力ファイルに追加されます。

おすすめ記事