使用正则表达式,变量和字符串将文件复制到新文件gsub?

时间:2013-12-17 15:30:11

标签: ruby regex gsub

我正在努力使用脚本来定位目录中的特定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')

设置整个方法的匹配路径。

1 个答案:

答案 0 :(得分:2)

您的替换字符串不是正则表达式,因此\d没有特殊含义,但只是一个文字字符串。您需要在正则表达式中指定一个组,然后您可以在替换字符串中使用捕获的组:

FileUtils.cp(file, file.gsub(/#{text}--(\d\d)/, "#{text}--\\1Bass "))

正则表达式中的括号形成组,可以在替换字符串中使用(按数字):第一组使用\1,第二组使用\2,等等。{{1} }指的是整个正则表达式匹配。

<强>更新

\0替换为gsub!()并转义替换字符串中的反斜杠(将gsub()视为捕获组,而不是文字字符...... Doh!)。