1

我正在尝试逐行遍历文件,替换子字符串。我有一个工作脚本 - 但如果有人可以帮助我理解为什么这个(我的原始)脚本不起作用,我会很感激

File.open('input3400.txt', 'rb') do |f|
  f.each_line do |i|
    File.write('input3400.txt', i["<aspect name="] = "hi")
  end
end

基本上,我想在这个文件中搜索所有实例<aspect name=并将它们替换为hi. 当我运行时,我得到了这个输出:

`[]=': 字符串不匹配 (IndexError)

`block (2 级别) in {top (required)}'

`每一行'

`block in {top (required)}'

4

3 回答 3

3

它不起作用,因为如果其中一行与模式不匹配,i["<aspect name="] = "hi"则会引发异常。IndexError<aspect name=

于 2013-10-21T12:33:53.867 回答
1

首先,您遇到的错误: i["<aspect name="] = "hi" 这会尝试替换"<aspect name="为,"hi" 但当"<aspect name="不是所需字符串的子字符串时会引发错误。

然后,您必须仔细查看这一行: File.write('input3400.txt', i["<aspect name="] = "hi")

为什么分配作为第二个参数传递?Ruby 上赋值的返回值是它的右边,没错,但是为什么要在这里使用赋值呢?

最后,File.write('input3400.txt', i["<aspect name="] = "hi")- 它对您的 current_line ( ) 一无所知i。你想去哪里File.write

希望有帮助!

于 2013-10-21T12:37:44.103 回答
0

您有几个错误,第一个错误是变量i是一个字符串,其中方法[]试图访问<aspect name=不存在的索引,第二个错误是您无法更新您打开读取的文件,您必须将数据放在临时位置,然后覆盖原始文件。

试试这个代码:

require 'fileutils'
require 'tempfile'

t_file = Tempfile.new('input3400_temp.txt')
File.open("input3400.txt", 'r') do |f|
  f.each_line do |line|
    t_file.puts(line.gsub('<aspect name=', 'hi'))
  end
end
t_file.close
FileUtils.mv(t_file.path, "input3400.txt")
于 2013-10-21T12:39:38.393 回答