2014-12-03 77 views
0

我正在編寫一個使用Sed(由gnuwin32版本4.2.1)轉換.m3u播放列表(使用Windows Media Player生成)的批處理腳本,並將其轉換爲接受作爲TeamSpeak 3插件「Soundboard」(來自http://www.kampfrausch.de/ts3)的輸入。用Sed轉換.m3u播放列表

總的想法是執行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

手動執行(與記事本++查找和替換)噸他的作品和播放列表完全有效。

但是,我似乎無法在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代碼,到目前爲止它只是一個不錯的選擇。我需要的只是一個在批處理中工作的解決方案。

問候,喬

+0

#8很簡單,只是'sed'/^$/d''。 7,也許有一些有用的[這裏](http://sed.sourceforge.net/sed1line.txt)。您的代碼註釋7與您的項目符號列表中的#7不太匹配。你想替換'.mp3'還是替換'\ r \ nfile'? – rojo 2014-12-03 21:36:05

+1

沒錯,但如果下一行以「file ...」開始,它會自動以f開始,並且在我的情況下沒有其他的f可能在行的開頭。因爲清晰而改變了它,謝謝! – 2014-12-03 21:39:21

回答

1

雖然我不是一個正則表達式專家可言,我編寫了一個名爲FindRepl.bat提供與MS的JScript語言相同的正則表達式功能的用戶一個批次的JScript腳本的混合,所以它運行在任何Windows版本的XP上。我的程序有趣的一點是,它允許您在同一運行中執行幾個替換,只要它們不依賴於對方。您也可以在文本文件中定義替換組而不是很長的命令行。這樣一來,你的替換集可在一個名爲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 

,我會很感激,如果你使用這個程序,你可以報告你得到的結果。

+0

在這個問題上休息了幾天,但這裏是我的結果:你的版本工作得很好,但我仍然在試圖找到一個批處理(僅限於)解決方案(不依賴於JScript)。對於最終用戶來說,您的工具非常好,但它並不能滿足我爲自己制定的要求。另外,如果我只是複製你的代碼,我會覺得有點不好:P – 2014-12-09 22:50:42

+0

感謝您的回覆!我的程序是否使用上面的替換文件創建了兼容Soundboard的播放列表?你不需要以任何方式調整它嗎?你可以添加任何其他評論,比如它有多快?再次感謝...... **':-)'** – Aacini 2014-12-10 02:45:33

+1

爲了提高速度,我們正在談論的時間遠遠低於一秒。我所做的只是使用你的語法和我的搜索和替換表達式來讓你的腳本工作,謝謝。由於時間不夠,我可能會在接下來的日子裏發佈一個無JScript的版本,並將其作爲答案發布。 – 2014-12-12 13:39:14