在文本文件中删除特定行?

6
我该如何从文本文件中删除一行特定的内容?比如第三行或者其他任意行。我尝试了以下方法:
line = 2
file = File.open(filename, 'r+')
file.each { last_line = file.pos unless file.eof? }
file.seek(last_line, IO::SEEK_SET)
file.close

很遗憾,它什么也没做。我尝试了很多其他的解决方案,但都没有起作用。


你所说的“inplace”是什么意思? - bugerrorbug
1
您可以修改现有文件(这是原地更新)或创建新文件。通常情况下,后者更受欢迎,因为它是非破坏性的。例如,使用选项“-i”或不使用“sed”。 - tokland
谢谢您的解释。我想知道如何进行原地更新。那将是太棒了。 - bugerrorbug
你能给我一个原地更新的例子吗?我搜索了sed但什么也没找到。 - bugerrorbug
1个回答

9

我认为由于文件系统的限制,你不能安全地这样做。

如果你真的想进行原地编辑,可以尝试将其写入内存,进行编辑,然后替换旧文件。但要注意,这种方法至少存在两个问题。首先,如果你的程序在重写过程中停止,你将得到一个不完整的文件。其次,如果你的文件太大,它会占用你的内存。

file_lines = ''

IO.readlines(your_file).each do |line|
  file_lines += line unless <put here your condition for removing the line>
end

<extra string manipulation to file_lines if you wanted>

File.open(your_file, 'w') do |file|
  file.puts file_lines
end

这样的方法应该可以工作,但是使用临时文件是更加安全和标准的做法。

require 'fileutils'

File.open(output_file, "w") do |out_file|
  File.foreach(input_file) do |line|
    out_file.puts line unless <put here your condition for removing the line>
  end
end

FileUtils.mv(output_file, input_file)

你的情况可能是任何表明它是不需要的行的情况,例如,file_lines += line unless line.chomp == "aaab",会删除行"aaab"。


我很感谢你的工作,Doodad,但是你提供的解决方案都不起作用。它给了我一个错误:“...undefined method 'line_to_remove?' for main:Object...”,因为有一个“?”。你能告诉我为什么吗? - bugerrorbug
对不起,line_to_remove?应该是删除的条件,我会相应地更新答案。 - Doodad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接