我有一个包含文件名的文本文件 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
- 插入新行