使用 Ruby 替换文件中的特定行

Replace a specific line in a file using Ruby

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

open
close
open
open
close
open

我需要找到一种方法将第 3 行替换为 "close"。我做了一些搜索,大多数方法涉及搜索该行而不是替换它。不能在这里真正做到,因为我不想将所有 "open" 变成 "close"。

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

的写入版本

怎么样:

lines = File.readlines('file')
lines[2] = 'close' << $/
File.open('file', 'w') { |f| f.write(lines.join) }
str = <<-_
my
dog
has
fleas
_

FNameIn  = 'in'
FNameOut = 'out'

首先,让我们将str写成FNameIn

File.write(FNameIn, str)
  #=> 17

FNameIn的内容写入FNameOut时,将FNameIn的第三行替换为"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 被省略,当 fout 超出范围时 FNameOut 被关闭。

#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继承了。