Regex 使用Sed转换.m3u播放列表

Regex 使用Sed转换.m3u播放列表,regex,batch-file,sed,Regex,Batch File,Sed,我正在编写一个批处理脚本,该脚本使用Sed(gnuwin32的4.2.1版)转换.m3u播放列表(使用Windows Media Player生成),并将其转换为可接受的格式,作为TeamSpeak 3插件“Soundboard”(来自)的输入 总体思路是执行8组搜索并替换所有: (一) 搜索: \.\.\\\.\.\\ 替换: C:\\Users\\Me\\ (二) 搜索: \.\.\\ 替换: C:\\Users\\Me\\Music\\ (三) 搜索: #EXTM3U 替换: 这里是空字

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

总体思路是执行8组搜索并替换所有:

  • (一) 搜索: \.\.\\\.\.\\ 替换: C:\\Users\\Me\\

  • (二) 搜索: \.\.\\ 替换: C:\\Users\\Me\\Music\\

  • (三) 搜索: #EXTM3U 替换: 这里是空字符串

  • (四) 搜索: :0, 替换: :-1

  • (五) 搜索: \\ 替换: /

  • (六) 搜索: C:/ 替换: file:///C:/

  • 7) 搜索: .mp3\r\n文件 替换: \r\n文件

  • (八) 搜索: ^\r\n 替换: 这里是空字符串

手动执行(使用记事本++查找和替换)此操作已起作用,播放列表完全可用

然而,我似乎无法在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代码,到目前为止,它只是一个不错的选择。我只需要一个批量工作的解决方案


Joe,您好尽管我不是一个regexp专家,但我编写了一个名为FindRepl.bat的批处理JScript混合脚本,它为用户提供了与MS JScript语言相同的regexp功能,因此它可以在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||''
每行都有一个regexp及其替换值,用
|
分隔;但是,替换项不是字符串,而是JScript表达式,因此它可能包含任何函数或方法(如
.toUpperCase()
等)。因此,当替换为文字字符串时,它必须用撇号括起来

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

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

如果您能报告使用此程序得到的结果,我将不胜感激。

#8很简单,只需
sed'/^$/d'
。对于7个人来说,也许有些有用的东西。您对7的代码注释与项目符号列表中的#7不太匹配。您想替换
.mp3
还是替换
\r\n文件
呢?没错,但是如果下一行以“file…”开头,它会自动以f开头,在我的例子中,没有其他与f相关的术语可以位于行的开头。不过,由于清晰,所以更改了它,谢谢!在这个问题上休息了几天,但我的结果是:您的版本运行得很好,但我仍在尝试找到一个批处理(-only)解决方案(不依赖JScript)。对于最终用户来说,您的工具非常好,但它不能完全满足我为自己制定的要求。另外,如果我只是复制了你的代码,我会感觉有点糟糕:谢谢你的回复!我的程序是否使用上面的替换文件创建了与音板兼容的播放列表?你不需要以任何方式调整它吗?你能添加其他评论吗,比如它有多快?。再次感谢<代码>:-)关于速度,我们谈论的是远低于一秒的时间。我所做的只是使用您的语法和搜索&替换表达式使您的脚本正常工作,谢谢。由于时间不够,我可能会在未来几天发布一个JScript免费版本,并将其作为一个答案发布。对不起。现在对我来说,重要的一点是通过两个长的替换或一个替换文件(如我发布的文件)来测试我程序的一次运行中的多个替换功能。为了得到结果,你是否运行了我的程序8次?如果是这样的话,如果您可以测试file方法(或alternations方法)并报告结果,我将不胜感激。蒂亚!