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

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

455360226 

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

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

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

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

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

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

你可以在一行中这样做:

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

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

我喜欢它读取的方式,但它当然也可以写成多行:

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

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

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

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

是你可以做但不应该做的事情的例证。