使用Ruby中的“+”文件IO模式替换文件中的一行

Ruby初学者在这里!

我知道Ruby的File.open方法有某些模式,如r,w,a,r +,w +,a +和免费的b。 我完全理解r,w和模式的使用。 但我似乎无法理解如何使用带有“+”符号的那些。 任何人都可以向我提供一些链接,其中有示例以及使用它的解释吗?

是否可以用它来读取一行并用相同数量的内容编辑/替换它? 如果是这样,那怎么样?

示例数据文件:a.txt

aaa bbb ccc ddd 

Demo.rb

 file = File.open "a.txt","r+" file.each do |line| line = line.chomp if(line=="bbb")then file.puts "big" end end file.close 

我试图用“大”替换“bbb”,但我得到了这个: – 在记事本++中

 aaa bbb big ddd 

在记事本中

 aaa bbb bigddd 

从另一个答案中抓取了这个文档,所以不是我的,解决方案是我的

 r Read-only mode. The file pointer is placed at the beginning of the file. This is the default mode. r+ Read-write mode. The file pointer will be at the beginning of the file. w Write-only mode. Overwrites the file if the file exists. If the file does not exist, creates a new file for writing. w+ Read-write mode. Overwrites the existing file if the file exists. If the file does not exist, creates a new file for reading and writing. a Write-only mode. The file pointer is at the end of the file if the file exists. That is, the file is in the append mode. If the file does not exist, it creates a new file for writing. a+ Read and write mode. The file pointer is at the end of the file if the file exists. The file opens in the append mode. If the file does not exist, it creates a new file for reading and writing. 

编辑:这里是你的样本的解决方案,大多数时候整个字符串被gsubbed并写回文件但是’infile’替换而不重写整个文件也是可能你应该小心用一个相同长度的字符串替换。

 File.open('a.txt', 'r+') do |file| file.each_line do |line| if (line=~/bbb/) file.seek(-line.length-3, IO::SEEK_CUR) file.write 'big' end end end => aaa big ccc ddd 

这是一种更传统的方式,虽然比其他大多数解决方案更简洁

 File.open(filename = "a.txt", "r+") { |file| file << File.read(filename).gsub(/bbb/,"big") } 

编辑2:我现在意识到这仍然可以缩短

 File.write(f = "a.txt", File.read(f).gsub(/bbb/,"big")) 

因此,您将整个文件读入变量,然后执行替换,并将变量的内容写回文件。 我对吗? 我正在寻找有点内联的东西

这是做到这一点的方法。 您可以替代地使用IO#readlines将所有行读入Array ,然后处理它们。

这已经回答了:

如何在模式文本中搜索模式并将其替换为给定值

如果您担心性能或内存使用情况,那么请使用正确的工具来完成正确的工作。 在*nix (或windows上的cygwin):

 sed -i -e "s/bbb/big/g" a.txt 

会做你想要的。