在文件中查找特定文本,将其从当前文件中剪切,然后将其粘贴到另一个文件中

时间:2015-03-21 06:25:15

标签: ruby regex file-io

我正在尝试在.rb文件中找到某段代码,一旦找到我想从当前文件中删除它,然后将其粘贴到另一个现有文件中。这是一个例子:

file1.rb具有以下内容:

RSpec.describe 'Get Test  Data' do

  it "should get test data for build" do |example|
    log_start_test("#{example.description}")
    get_test_data
    log_complete_test("#{example.description}")
  end

end

我想找it "should get test data for build" do |example|,然后剪下这段代码:

 it "should get test data for build" do |example|
    log_start_test("#{example.description}")
    get_test_data
    log_complete_test("#{example.description}")
  end

并将其粘贴到另一个文件中。 到目前为止,我已经能够使用类似的东西找到所需的字符串:

    File.open("#{Dir.pwd}/spec/api/test_data_search_spec.rb") do |f|
      f.each_line do |line|
        if line =~ /do |example|/
          puts "Found root #{line}"
        end
      end
    end

无法弄清楚确切的正则表达式以找到所需的块,然后如何从文件中剪切并粘贴到另一个文件中?任何想法都会很棒。

2 个答案:

答案 0 :(得分:0)

正则表达式不适合解析代码。

您可以使用method_source作为问题的现有解决方案。

答案 1 :(得分:0)

谢谢@phoet。这本来适用于特定的方法,但我更多的是寻找移动rspec示例代码块。但这是我最终使用的例子:

  def move_example_block(example_description, source_file,destination_file)
    lines = File.readlines("#{Dir.pwd}/spec/api/#{source_file}_spec.rb")
    desired_block = lines.join[/it "should get test data for build" do(.*)end/m]
    temp = desired_block.freeze
    puts temp
    filename = "#{Dir.pwd}/spec/api/#{source_file}_spec.rb"
    text = File.read(filename)
    puts = text.gsub(/it "#{example_description}" do(.*)end/m, "end")
    File.open(filename, "w") { |file| file << puts }

    filename = "#{Dir.pwd}/spec/api/#{destination_file}_spec.rb"
    text = File.read(filename)
    puts = text.gsub(/end/, temp)
    File.open(filename, "w") { |file| file << puts }
  end