我试图在简短的Ruby脚本中转义括号和括号。该脚本将目录的名称作为参数,在目录中创建.mp3s的播放列表,并从目录中命名播放列表。
如果目录有大括号或括号,它会在没有错误的情况下失败,它只是没有制作播放列表。这是代码:
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)但它仍然无法使用.gsub!
。此外,我宁愿不逃避他们,我想要包括他们的标题。 Regexp.escape
会成为答案吗?
编辑:澄清一下,轨道名称不必是完整路径,因为播放列表将与轨道本身位于同一目录中。见:http://en.wikipedia.org/wiki/M3U
答案 0 :(得分:4)
以下内容应该有效:
escaped_path = path.gsub(/([\[\]\{\}\*\?\\])/, '\\\\\1')
tracks = Dir["#{escaped_path}/*.mp3"]
我通过查看Dir.glob的API来确定需要转义的字符。正则表达式很复杂,因为在正则表达式中也使用相同的字符!
与您的括号问题分开,您有一个更大的问题。你基本上像Schlemiel the Painter那样反复重写m3u文件。最好在轨道循环之外打开文件句柄。