
Ich habe eine Textdatei Test.m3u, die die folgenden Dateinamen enthält:
FileName1.mp4
FileName2.mp4
FileName3.mp4
Ich muss eine Wiedergabeliste in folgender Form erstellen:
#EXTM3U
#EXTINF:FileName1
PATH/FileName1.mp4
#EXTINF:FileName2
PATH/FileName2.mp4
#EXTINF:FileName3
PATH/FileName3.mp4
Der Befehl:
sed -i -e 's/^/PATH:/' test.m3u
fügt jeder Zeile den Pfad hinzu, aber wie kann ich die Zeile #EXTINF:FileNameX über jede Zeile setzen?
Antwort1
Perl zur Rettung!
perl -i -ne '/(.*)\.mp4/;print "#EXTINF:$1\nPATH/$_"' -- file
Sie können auch Folgendes einschließen:
BEGIN { print "#EXTM3U\n\n" }
um den Header in der Ausgabe zu erhalten.
-i
ändert die Datei(en) „an Ort und Stelle“-n
liest die Eingabe zeilenweise- Klammern
()
erstellen eine Erfassungsgruppe, die mit dem gefüllt wird, was der ersten Erfassungsgruppe entspricht$1
(ähnlich wie\1
in sed) \.
, wie in sed, entspricht dem wörtlichen Punkt- druckengibt nur seine Argumente aus
$_
darunter-n
steht der Inhalt der aktuellen Zeile
Antwort2
dieser Befehl hat bei mir funktioniert:
$ sed -e 's/\(.*\)\.\(.*\)/#EXTINF:\1\nPATH\/\1.\2/' test.m3u
#EXTINF:FileName1
PATH/FileName1.mp4
#EXTINF:FileName2
PATH/FileName2.mp4
#EXTINF:FileName3
PATH/FileName3.mp4
Erläuterung:
.*
- das passt zu allem
\(.*\)
- das passt zu allem und kann wiederverwendet werden (mit \1 und dem nächsten mit \2)
\.
- dies entspricht dem tatsächlichen Punktzeichen (das in diesem Fall den Basisnamen von der Erweiterung trennt)
\n
- dies fügt eine neue Zeile ein