Ruby - 打开文件,查找并替换多行

时间:2010-10-29 03:04:38

标签: ruby

我是ruby的新手,希望有人可以帮我弄清楚如何打开文件,然后使用gsub查找并替换多个条件。

这是我到目前为止所得到的,但这似乎不起作用,因为第二个替换var会覆盖第一个:

text = File.read(filepath)
replace = text.gsub(/aaa/, "Replaced aaa with 111")
replace = text.gsub(/bbb/, "Replace bbb with 222")
File.open(filepath, "w") {|file| file.puts replace}

6 个答案:

答案 0 :(得分:27)

将第三行更改为

replace = replace.gsub(/bbb/, "Replace bbb with 222")

答案 1 :(得分:16)

您每次都要从原来的“文本”替换,第二行需要替换替换:

replace = replace.gsub(/bbb/, "Replace bbb with 222")

答案 2 :(得分:9)

有趣的是,如果您不想重新扫描数据,请使用gsub的块形式:

replace = text.gsub(/(aaa|bbb)/) do |match|
  case match
    when 'aaa': 'Replaced aaa with 111'
    when 'bbb': 'Replace bbb with 222'
  end
end

这可能不是最有效的做事方式,但这是看待问题的另一种方式。如果性能对您很重要,那就值得对两种方式进行基准测试。

答案 3 :(得分:2)

我可能会像这样写出来......

#!/usr/bin/env ruby

filepath = '/tmp/test.txt'

File.open filepath, 'w' do |f|
  $<.each_line do |line|
    f.puts line.gsub(/aaa/,
      'Replaced aaa with 111').gsub /bbb/, 'Replace bbb with 222'
  end
end

答案 4 :(得分:2)

这是一个单线

IO.write(filepath, File.open(filepath) {|f| f.read.gsub(/aaa|bbb/) {|m| (m.eql? 'aaa') '111' : '222'}})

IO.write默认情况下截断给定文件,因此如果您先读取文本,请执行正则表达式String.gsub并在块模式下使用File.open返回结果字符串,它将替换文件的内容。好漂亮吧?

它也适用于多行:

IO.write(filepath, File.open(filepath) do |f|
    f.read.gsub(/aaa|bbb/) do |m|
      (m.eql? 'aaa') '111' : '222'
    end
  end
)

答案 5 :(得分:0)

对@steveRoss的答案的另一个很好的扩展,使用变量:

aktivBold = 'AktivGrotesk_Bd.ttf'
clarityBold = 'Clarity-Bold.otf'    

files.each do |file_name|
  text = File.read(file_name)

  replace = text.gsub(/(#{aktivBold}|#{aktivLight}|#{aktivMedium})/) do |match|
      case match
        when aktivBold
            clarityBold
        when aktivLight
            clarityLight
        when aktivMedium
            clarityMedium                       
      end
    end

  File.open(file_name, "w") { |file| file.puts replace }

end

这些不是字符串文字,而是变量