
Tengo un archivo de texto Test.m3u que contiene nombres de archivos:
FileName1.mp4
FileName2.mp4
FileName3.mp4
Necesito hacer una lista de reproducción de la siguiente forma:
#EXTM3U
#EXTINF:FileName1
PATH/FileName1.mp4
#EXTINF:FileName2
PATH/FileName2.mp4
#EXTINF:FileName3
PATH/FileName3.mp4
El comando:
sed -i -e 's/^/PATH:/' test.m3u
Agregará Ruta a cada línea, pero ¿cómo puedo poner la línea #EXTINF:FileNameX encima de cada línea?
Respuesta1
Perl al rescate!
perl -i -ne '/(.*)\.mp4/;print "#EXTINF:$1\nPATH/$_"' -- file
También puedes incluir
BEGIN { print "#EXTM3U\n\n" }
para obtener el encabezado en la salida.
-i
cambia los archivos "en su lugar"-n
lee la entrada línea por línea- Los paréntesis
()
crean un grupo de captura, lo que coincide con el primer grupo de captura se completa$1
(similar a\1
en sed) \.
, como en sed, coincide con el punto literal- imprimirsimplemente muestra sus argumentos
$_
debajo-n
está el contenido de la línea actual
Respuesta2
este comando funcionó para mí:
$ 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
explicación:
.*
- esto coincide con cualquier cosa
\(.*\)
- esto coincide con cualquier cosa y se puede reutilizar (por \1 y el siguiente con \2)
\.
- esto coincide con el carácter de punto real (que separa el nombre base de la extensión en este caso)
\n
- esto inserta una nueva línea