使用Sed转换.m3u播放列表

时间:2014-12-03 20:27:00

标签: regex batch-file sed

我正在编写一个使用Sed(版本4.2.1 by gnuwin32)转换.m3u播放列表(使用Windows Media Player生成)的批处理脚本,并将其转换为可接受为TeamSpeak输入的格式3插件“Soundboard”(来自http://www.kampfrausch.de/ts3)。

一般的想法是执行8组搜索并替换所有:

  • 1) 搜索: \。\。\\\ \ \\。 更换: C:\\用户\\我\\

  • 2) 搜索: \。\。\\ 更换: C:\\用户\\我\\音乐\\

  • 3) 搜索: #EXTM3U 更换: EMPTY_STRING_HERE

  • 4) 搜索: :0, 更换: :-1,

  • 5) 搜索: \\ 更换: /

  • 6) 搜索: C:/ 更换: 文件:/// C:/

  • 7) 搜索: MP3播放\ r \ nfile的 更换: \ r \ nfile的

  • 8) 搜索: ^ \ r \ n 更换: EMPTY_STRING_HERE

手动执行(使用Notepad ++查找和替换)这已经有效,播放列表功能完全正常。

但是,我似乎无法在Sed中编写7)和8)的语法,因为Sed不是一次比较多行的最佳工具。

以下是目前的代码:

@echo off

sed s/\.\.\\\.\.\\/C:\\Users\\Me\\/g badplaylist.m3u > temp.dat
type temp.dat > badplaylist.m3u

sed s/\.\.\\/C:\\Users\\Me\\Music\\/g badplaylist.m3u > temp.dat
type temp.dat > badplaylist.m3u

sed s/#EXTM3U//g badplaylist.m3u > temp.dat
type temp.dat > badplaylist.m3u

sed s/:0,/:-1,/g badplaylist.m3u > temp.dat
type temp.dat > badplaylist.m3u

sed s/\\/\//g badplaylist.m3u > temp.dat
type temp.dat > badplaylist.m3u

sed s/C:\//file:\/\/\/C:\//g badplaylist.m3u > temp.dat
type temp.dat > badplaylist.m3u

:: 7) expression, that removes ".mp3" at the end of a line if the NEXT line starts with "file:///C:/"

:: 8) remove all completely empty lines

del temp.dat

有人知道如何解决7)和8)?

当然我不需要Sed代码,到目前为止它只是一个不错的选择。我所需要的只是一个批处理的解决方案。

问候,乔

1 个答案:

答案 0 :(得分:1)

虽然我根本不是正则表达式专家,但我编写了一个名为FindRepl.bat的Batch-JScript混合脚本,它为用户提供了与MS JScript语言相同的正则表达式功能,因此它可以在XP上的任何Windows版本中运行。我的程序的有趣之处在于,它允许您在同一次运行中执行几个替换,只要它们不相互依赖。您还可以在文本文件中定义替换集,而不是非常长的命令行。这样,您的替换集可以在名为M3UtoSoundboard.txt的文件中定义,例如,使用以下内容:

// Replacements file to convert an .m3u playlist into a Soundboard compatible one
// Use this file with FindRepl.bat program
// http://www.dostips.com/forum/viewtopic.php?f=3&t=4697

// 1) search : \.\.\\\.\.\\ replace: C:\\Users\\Me\\
\.\.\\\.\.\\||'C:\\Users\\Me\\'

// 2) search: \.\.\\ replace: C:\\Users\\Me\\Music\\
\.\.\\||'C:\\Users\\Me\\Music\\'

// 3) search: #EXTM3U replace: EMPTY_STRING_HERE
#EXTM3U||''

// 4) search: :0, replace: :-1,
:0,||':-1,'

// 5) search: \\ replace: /
\\||'\/'

// 6) search: C:/ replace: file:///C:/
C:\/||'file:\/\/\/C:\/'

// 7) search: .mp3\r\nfile replace: \r\nfile
\.mp3\r\nfile||'\r\nfile'

// 8) search: ^\r\n replace: EMPTY_STRING_HERE
^\r\n||''

每一行都有一个正则表达式,其替换值由||分隔;但是,替换是不是字符串,而是JScript表达式,因此它可能包含任何函数或方法(如.toUpperCase()等)。出于这个原因,当替换是文字字符串时,它必须用撇号括起来。

您可以从this site下载FindRepl.bat程序;源代码下方的该站点包含完整的文档。之后,以这种方式执行:

< thePlaylist.m3u FindRepl /G:M3UtoSoundboard.txt /A /J > theConvertedList.xyz

如果你使用这个程序报告结果,我将不胜感激。