我有一个配置文件,我想添加一个字符串,看起来像这样:
line1
line2
line3
line4
字符串
新的字符串不应该被追加,而是写在文件中间的某个地方。因此,我在文件中寻找一个特定的位置(或字符串),当它被找到时,我插入我的新字符串:
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
型
问题是Ruby用新文本覆盖了该位置的行,因此结果如下:
line1
Some nice little sentence
line3
line4
型
我想要的是“真实的”插入:
line1
Some nice little sentence
line2
line3
line4
型
如何才能做到这一点?
6条答案
按热度按时间mec1mxoz1#
如果它是一个小文件,我认为最简单的方法是:
这就是Rails在幕后的工作方式。
或者你可以一行一行地复制它,然后像这样用
mv
覆盖原始文件:字符串
ibrsph3r2#
字符串
如果你想添加到现有的...
型
w9apscun3#
还有几个选择:
字符串
ej83mcc04#
最简单的方法是读取内存中的整个文件,然后将第一部分写回文件,将插入的行写回文件,并将剩余部分写回文件。当您将文件作为行数组读取时,这应该相对简单,但如果文件非常大,则可能会遇到问题,因为您必须使用这种方法将整个文件读取到内存中。
或者,你可以找到你想要插入行的位置,将该位置之后的行读入内存,在文件中查找该位置,将新的行写入文件,最后将剩余的行写入文件。如果文件的剩余部分非常大,你也会遇到问题,因为你必须将其全部读入内存。
第三种方法是将第一部分写入一个新文件,将插入的行写入一个新文件,将原始文件的其余部分写入新文件,最后在文件系统中用新文件替换旧文件。这种方法允许您每次处理一行,因此可以处理内存不适合的文件。
文件写入工作方式是这样的,因为文件就像一个固定大小的字节数组:当你写一个字节到文件你将覆盖现有的字节(我忽略了你在这里附加到文件的情况)因此,将任何内容插入文件的唯一方法是首先通过从旧位置阅读旧内容并将其写入新位置来将旧内容移动到新位置。您可以将数据“插入”到现在的空闲区域中。
8mmmxcuj5#
tty-file gem有一个
inject_into_file
方法用于此目的。安装gem:
字符串
然后:
型
piok6c0g6#
受到@Jonas Elfström提供的答案的启发,我写了一个Ruby gem,名为insert_after,你可以从命令行或Ruby程序中使用它。
命令行用法
字符串
Ruby程序使用
型
程序代码
这是主要的方法:
型
命令行安装
型
安装用于Ruby程序
将这一行添加到应用程序的
Gemfile
中:型
.或将以下内容添加到应用程序的
.gemspec
:型
然后执行:
型
更多信息
参见https://github.com/mslinn/insert_after