如何将字符串插入文本文件

aur*_*bee 11 ruby ruby-on-rails

我有一个配置文件,我想添加一个字符串,看起来像这样:

line1
line2
line3
line4
Run Code Online (Sandbox Code Playgroud)

不应附加新字符串,而是将其写入文件中间的某处.因此,我在文件中寻找一个特定的位置(或字符串),当它被找到时,我插入我的新字符串:

file = File.open(path,"r+")
while (!file.eof?)
  line = file.readline
  if (line.downcase.starts_with?("line1"))
    file.write("Some nice little sentence")
  end
end
Run Code Online (Sandbox Code Playgroud)

问题是Ruby使用新文本覆盖该位置的行,因此结果如下:

line1
Some nice little sentence
line3
line4
Run Code Online (Sandbox Code Playgroud)

我想要的是一个"真正的"插入:

line1
Some nice little sentence
line2
line3
line4
Run Code Online (Sandbox Code Playgroud)

怎么能实现这一目标?

Jon*_*röm 11

如果它是一个小文件,我认为最简单的方法是:

  • 阅读完整的文件.
  • 插入行.
  • 写下新文件.

这就是Rails在幕后进行的方式.

或者你可以逐行复制它,然后mv像这样覆盖原始:

require 'fileutils'

tempfile=File.open("file.tmp", 'w')
f=File.new("file.txt")
f.each do |line|
  tempfile<<line
  if line.downcase=~/^line2/
    tempfile << "Some nice little sentence\n"
  end
end
f.close
tempfile.close

FileUtils.mv("file.tmp", "file.txt")
Run Code Online (Sandbox Code Playgroud)


kej*_*len 6

其他几个选项:

file = File.read(path).sub(/line2\n/, 'Some nice little sentence\n\1')
File.write(path, file)

file = File.readlines(path)
index = file.index("line2")
file.insert(index, "Some nice little sentence")
File.write(path, file)
Run Code Online (Sandbox Code Playgroud)


ffo*_*oeg 6

def replace(filepath, regexp, *args, &block)
  content = File.read(filepath).gsub(regexp, *args, &block)
  File.open(filepath, 'wb') { |file| file.write(content) }
end


replace(my_file, /^line2/mi) { |match| "Some nice little sentence"}

line1
Some nice little sentence
line2
line3
line4
Run Code Online (Sandbox Code Playgroud)

如果你想附加到现有...

replace(my_file, /^line2/mi) do |match| 
  "#{match} Some nice little sentence"
end

line1
line2 Some nice little sentence
line2
line3
line4
Run Code Online (Sandbox Code Playgroud)

  • 我确定你注意到你在上一个例子中打印了 line2 两次。 (2认同)