使用 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
继承了。
我有一个如下所示的文本文件 (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
继承了。