Necesita ayuda con sed, awk u otra herramienta que pueda manipular archivos de texto

Necesita ayuda con sed, awk u otra herramienta que pueda manipular archivos de texto

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.

  • -icambia los archivos "en su lugar"
  • -nlee 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 \1en sed)
  • \., como en sed, coincide con el punto literal
  • imprimirsimplemente muestra sus argumentos
  • $_debajo -nestá 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

información relacionada