あるテキストファイルの行を別のテキストファイルの行に置き換える

あるテキストファイルの行を別のテキストファイルの行に置き換える

次の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

編集する:.tsfileにリストされている各ファイルは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.tspl

.tsこれらの文字列は、各URLをスラッシュまたは疑問符で区切られた文字列として扱い、その文字列から4番目のフィールドを選択することで見つけることができます。

その後、コードは.m3u8ファイルから行を読み取り、文字で始まらない各行について、その行が配列のキーであるかどうかを#テストしますpl。その場合、現在の行は配列の対応するURLに置き換えられます。.m3u8次に、ファイルのすべての行を印刷します(今説明したように変更可能)。

上記の例では、プレイリストファイルの最後のエントリは、そのエントリのURLがファイルにないために置き換えられていないことを示していますurls

おすすめ記事