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)
其他几个选项:
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)
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)
| 归档时间: |
|
| 查看次数: |
12007 次 |
| 最近记录: |