我正在努力使用脚本来定位目录中的特定XML文件,并将它们重命名为具有不同名称的副本。
我输入了puts
语句进行调试,从我所知道的,在FileUtils.cp
行之前一切正常。我用更简单的文本尝试了这个并且它有效,但我过于复杂cp(file, file.gsub())
似乎导致了我无法弄清楚的问题。
def piano_treatment(cats)
FileUtils.chdir('12Piano')
src = Dir.glob('*.xml')
src.each do |file|
puts file
cats.each do |text|
puts text
if file =~ /#{text}--\d\d/
puts "Match Found!!"
puts FileUtils.pwd
FileUtils.cp(file, file.gsub!(/#{text}--\d\d/, "#{text}--\d\dBass "))
end
end
end
end
piano_treatment(cats)
我在终端中获得以下输出:
12Piano--05Free Stuff--11Test.xml
05Free Stuff
Match Found!!
/Users/mbp/Desktop/Sibelius_Export/12Piano
cp 12Piano--05Free Stuff--ddBass Test.xml 12Piano--05Free Stuff--ddBass Test.xml
/Users/mbp/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/fileutils.rb:1551:in `stat': No such file or directory - 12Piano--05Free Stuff--ddBass Test.xml (Errno::ENOENT)
为什么\d\d
显示为"dd"
实际上应该是数字?这是单引号和双引号问题吗?两者都产生错误。
任何建议都表示赞赏。感谢。
编辑此代码需要进行一项其他更改。 FileUtils.chdir('12Piano')
将更改循环的第一次迭代的目录,但之后它将恢复到源目录。相反,我这样做了:
def piano_treatment(cats)
src = Dir.glob('12Piano/*.xml')
设置整个方法的匹配路径。
答案 0 :(得分:2)
您的替换字符串不是正则表达式,因此\d
没有特殊含义,但只是一个文字字符串。您需要在正则表达式中指定一个组,然后您可以在替换字符串中使用捕获的组:
FileUtils.cp(file, file.gsub(/#{text}--(\d\d)/, "#{text}--\\1Bass "))
正则表达式中的括号形成组,可以在替换字符串中使用(按数字):第一组使用\1
,第二组使用\2
,等等。{{1} }指的是整个正则表达式匹配。
<强>更新强>
将\0
替换为gsub!()
并转义替换字符串中的反斜杠(将gsub()
视为捕获组,而不是文字字符...... Doh!)。