次のHLSプレイリストファイルがあります。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:12
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:12.500000,
playlist0.ts
#EXTINF:8.333333,
playlist1.ts
#EXTINF:12.500000,
playlist2.ts
....
これには、次のlink()を含むファイルがありますsignurls.txt
。
https://example.com/playlist0.ts?Sign=xyz&Exp=1639139375&AWSAccessKeyId=abc
https://example.com/playlist1.ts?Sign=yzx&Exp=1639139375&AWSAccessKeyId=bca
https://example.com/playlist10.ts?Sign=zyx&Exp=1639139375&AWSAccessKeyId=cab
....
.m3u8
次のファイルにリンクを挿入しようとしています。
....
#EXTINF:12.500000,
https://example.com/playlist0.ts?Sign=xyz&Exp=1639139375&AWSAccessKeyId=abc
....
私はこのスクリプトを思い出しました。
for f in *.ts; do
sed -i '' -e "'s|$f|`grep -e $f signurls.txt`|'" playlist.m3u8;
done
編集する:.ts
fileにリストされている各ファイルはplaylist.m3u8
現在のディレクトリにあります。ループには実際のファイルを使用するので、for
問題なくプレイリストファイルを変更できます。
その理由は、-i ''
macOSとLinuxの両方で実行する必要があるからです。
文字列をエコーしてみるsed
と、文字列拡張が期待どおりに機能することがわかります。
ただし、スクリプトを実行すると、次のエラーが発生します(1行のスクリプト)。
sed: 1: "'s|playlist0.ts|https:/ ...": invalid command code '
ベストアンサー1
something.ts
コードで明確に使用しているファイルを呼び出すように見えることは無視します。記事にはこの内容について言及していないので分からないふりをします。
$ cat urls
https://example.com/playlist0.ts?Sign=xyz&Exp=1639139375&AWSAccessKeyId=abc
https://example.com/playlist1.ts?Sign=yzx&Exp=1639139375&AWSAccessKeyId=bca
https://example.com/playlist10.ts?Sign=zyx&Exp=1639139375&AWSAccessKeyId=cab
$ cat playlist.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:12
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:12.500000,
playlist0.ts
#EXTINF:8.333333,
playlist1.ts
#EXTINF:12.500000,
playlist2.ts
$ awk -F'[/?]' 'NR==FNR { pl[$4]=$0; next } /^[^#]/ && ($0 in pl) { $0 = pl[$0] }; 1' urls playlist.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:12
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:12.500000,
https://example.com/playlist0.ts?Sign=xyz&Exp=1639139375&AWSAccessKeyId=abc
#EXTINF:8.333333,
https://example.com/playlist1.ts?Sign=yzx&Exp=1639139375&AWSAccessKeyId=bca
#EXTINF:12.500000,
playlist2.ts
上記のコマンドは最初に最初のawk
ファイル()からURLを読み取り、その文字列を名前付き連想配列にキーとして追加します。完全な URL が配列値として追加されます。urls
.ts
pl
.ts
これらの文字列は、各URLをスラッシュまたは疑問符で区切られた文字列として扱い、その文字列から4番目のフィールドを選択することで見つけることができます。
その後、コードは.m3u8
ファイルから行を読み取り、文字で始まらない各行について、その行が配列のキーであるかどうかを#
テストしますpl
。その場合、現在の行は配列の対応するURLに置き換えられます。.m3u8
次に、ファイルのすべての行を印刷します(今説明したように変更可能)。
上記の例では、プレイリストファイルの最後のエントリは、そのエントリのURLがファイルにないために置き換えられていないことを示していますurls
。