问题描述
|
我试图在简短的Ruby脚本中转义括号和方括号。该脚本将目录名称作为参数,在目录中创建.mp3的播放列表,然后从目录中命名播放列表。
如果目录带有花括号或括号,则该目录将失败而不会出现错误,它只是不会创建播放列表。这是代码:
1 #!/usr/bin/ruby -w
2
3 # create a playlist for a specified directory of .mp3 files
4
5 puts \"enter path to album:\"
6 chomped = gets.chomp
7 path = File.expand_path(\"#{chomped}\")
8
9 data = \"#EXTM3U\\n\"
10 tracks = Dir[\"#{path}/*.mp3\"]
11 name = path.sub(/.*\\/(.*)/,\"\\\\1\")
12 name.gsub!(/_/,\" \")
13 name.gsub!(/(\\A|\\s)\\w/) { |c| c.upcase }
14 tracks.sort.each do |track|
15 track_name = track.sub(/.*\\/(.*)/,\"\\\\1\")
16 data += \"#EXTINF:\\n\" + track_name + \"\\n\"
17 end
18 File.open(\"#{path}/#{name}.m3u\",\"a\") { |f| f.write data }
19 puts \"created #{path}/#{name}.m3u\"
我已经能够转义下划线,并且我想我得到了一个正则表达式来转义其他字符(http://rubular.com/r/BNUnjsde6J),但是使用ѭ1仍然失败。另外,我也不想逃脱它们,我希望标题包括它们。 Regexp.escape
是答案吗?
编辑:为了澄清,轨道名称不必是完整路径,因为播放列表将与轨道本身位于同一目录中。请参阅:http://en.wikipedia.org/wiki/M3U
解决方法
以下应该工作:
escaped_path = path.gsub(/([\\[\\]\\{\\}\\*\\?\\\\])/,\'\\\\\\\\\\1\')
tracks = Dir[\"#{escaped_path}/*.mp3\"]
通过查看Dir.glob的API,我确定了需要转义的字符。正则表达式很复杂,因为正则表达式中也使用相同的字符!
除了括号问题之外,您还有一个更大的问题。基本上,您就像画家Schlemiel一样,一遍又一遍地重写m3u文件。最好在track循环之外打开文件句柄。