Brauche Hilfe sed, awk oder ein anderes Tool, das Textdateien manipulieren kann

Brauche Hilfe sed, awk oder ein anderes Tool, das Textdateien manipulieren kann

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“
  • -nliest die Eingabe zeilenweise
  • Klammern ()erstellen eine Erfassungsgruppe, die mit dem gefüllt wird, was der ersten Erfassungsgruppe entspricht $1(ähnlich wie \1in sed)
  • \., wie in sed, entspricht dem wörtlichen Punkt
  • druckengibt nur seine Argumente aus
  • $_darunter -nsteht 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

verwandte Informationen