
У меня есть текстовый файл 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
(аналогично\1
sed) \.
, как и в 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
- это вставляет новую строку