使用Ruby

时间:2016-03-12 14:08:12

标签: ruby line overwrite

我有一个文本文件(a.txt),如下所示。

open
close
open
open
close
open

我需要找到一种用" close"替换第3行的方法。我做了一些搜索,大多数方法都涉及搜索线而不是替换它。我不能真的在这里做,因为我不想把所有的"打开"到"关闭"。

基本上(对于这种情况)我正在寻找IO.readlines的写版本(" ./ a.txt")[2]。

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