Ruby:如何替换文件中的文本?

时间:2011-09-03 02:59:14

标签: ruby regex replace

以下代码是xml文件中的一行:

<appId>455360226</appId>

如何使用ruby将2个标签之间的数字替换为另一个数字?

4 个答案:

答案 0 :(得分:15)

不可能一步修改文件内容(至少我知道,当文件大小改变时)。 您必须阅读该文件并将修改后的文本存储在另一个文件中。

replace="100"
infile = "xmlfile_in"
outfile = "xmlfile_out"
File.open(outfile, 'w') do |out|
  out << File.open(infile).read.gsub(/<appId>\d+<\/appId>/, "<appId>#{replace}</appId>")
end  

或者您将文件内容读取到内存中,然后使用修改后的内容覆盖文件:

replace="100"
filename = "xmlfile_in"
outdata = File.read(filename).gsub(/<appId>\d+<\/appId>/, "<appId>#{replace}</appId>")

File.open(filename, 'w') do |out|
  out << outdata
end  

(希望它有效,代码未经过测试)

答案 1 :(得分:6)

你可以这样做一行:

IO.write(filepath, File.open(filepath) {|f| f.read.gsub(//<appId>\d+<\/appId>/, "<appId>42</appId>"/)})

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

我喜欢这种方式,但当然也可以写成多行:

IO.write(filepath, File.open(filepath) do |f|
    f.read.gsub(//<appId>\d+<\/appId>/, "<appId>42</appId>"/)
  end
)

答案 2 :(得分:2)

replace="100"
File.open("xmlfile").each do |line|
  if line[/<appId>/ ]
     line.sub!(/<appId>\d+<\/appId>/, "<appId>#{replace}</appId>")
  end
  puts line
end

答案 3 :(得分:1)

正确的方法是使用XML解析工具,其示例为XmlSimple

您确实用正则表达式标记了您的问题。如果你真的必须使用正则表达式那么

s = "Blah blah <appId>455360226</appId> blah"
s.sub(/<appId>\d+<\/appId>/, "<appId>42</appId>")

是您可以做的事情的例证,但shouldn't