Нужна помощь с sed, awk или другим инструментом, который может работать с текстовыми файлами

Нужна помощь с sed, awk или другим инструментом, который может работать с текстовыми файлами

У меня есть текстовый файл Test.m3u, содержащий имена файлов:

FileName1.mp4
FileName2.mp4
FileName3.mp4

Мне нужно составить плейлист в следующем виде:

#EXTM3U

#EXTINF:FileName1
PATH/FileName1.mp4
#EXTINF:FileName2
PATH/FileName2.mp4
#EXTINF:FileName3
PATH/FileName3.mp4

Команда:

sed -i -e 's/^/PATH:/' test.m3u

добавит путь к каждой строке, но как мне поместить строку #EXTINF:FileNameX над каждой строкой?

решение1

Perl спешит на помощь!

perl -i -ne '/(.*)\.mp4/;print "#EXTINF:$1\nPATH/$_"' -- file

Вы также можете включить

BEGIN { print "#EXTM3U\n\n" }

чтобы получить заголовок в выводе.

  • -iизменяет файл(ы) «на месте»
  • -nчитает ввод построчно
  • скобки ()создают группу захвата, то, что соответствует первой группе захвата, заполняется $1(аналогично \1sed)
  • \., как и в sed, соответствует буквальной точке
  • Распечататьпросто выводит свои аргументы
  • $_под ним -nнаходится содержимое текущей строки

решение2

Эта команда сработала для меня:

$ 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

объяснение:

.*- это соответствует чему угодно

\(.*\)- это соответствует чему угодно и может быть использовано повторно (с помощью \1 и следующего с помощью \2)

\.- это соответствует фактическому символу точки (который в данном случае разделяет базовое имя от расширения)

\n- это вставляет новую строку

Связанный контент