我有一个文本文件(a.txt),如下所示。
open
close
open
open
close
open
我需要找到一种用" close"替换第3行的方法。我做了一些搜索,大多数方法都涉及搜索线而不是替换它。我不能真的在这里做,因为我不想把所有的"打开"到"关闭"。
基本上(对于这种情况)我正在寻找IO.readlines的写版本(" ./ a.txt")[2]。
答案 0 :(得分:5)
如下:
lines = File.readlines('file')
lines[2] = 'close' << $/
File.open('file', 'w') { |f| f.write(lines.join) }
答案 1 :(得分:0)
str = <<-_
my
dog
has
fleas
_
FNameIn = 'in'
FNameOut = 'out'
首先,让我们将str
写入FNameIn
:
File.write(FNameIn, str)
#=> 17
在将FNameIn
的内容写入FNameIn
时,可以通过以下几种方法将FNameOut
的第三行替换为“had”。
#1读一行,写一行
如果文件很大,您应该从输入文件中读取并一次写入一行输出文件,而不是在内存中保留大字符串或字符串数组。
fout = File.open(FNameOut, "w")
File.foreach(FNameIn).with_index { |s,i| fout.puts(i==2 ? "had" : s) }
fout.close
让我们检查FNameOut
是否写得正确:
puts File.read(FNameOut)
my
dog
had
fleas
请注意,如果字符串尚未以记录分隔符结尾,则IO#puts会写入记录分隔符。 1 。此外,如果省略fout.close
,则FNameOut
超出范围时会关闭fout
。
#2使用正则表达式
r = /
(?:[^\n]*\n) # Match a line in a non-capture group
{2} # Perform the above operation twice
\K # Discard all matches so far
[^\n]+ # Match next line up to the newline
/x # Free-spacing regex definition mode
File.write(FNameOut, File.read(FNameIn).sub(r,"had"))
puts File.read(FNameOut)
my
dog
had
fleas
1 File.superclass #=> IO
,因此IO
的方法会继承File
。