4

Ruby初学者在这里!

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

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

样本数据文件:a.txt

aaa
bbb
ccc
ddd

演示.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

我正在尝试用“big”替换“bbb”,但我得到了这个:- 在记事本++中

aaa
bbb
big

ddd

在记事本中

aaa
bbb
bigddd
4

2 回答 2

11

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

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") } 

EDIT2:我现在意识到这还可以更短

File.write(f = "a.txt", File.read(f).gsub(/bbb/,"big"))
于 2012-04-16T11:18:46.873 回答
0

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

这就是这样做的方法。您可以交替使用IO#readlines将所有行读入Array然后处理它们。

这已经得到了回答:

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

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

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

会做你想做的事。

于 2012-04-16T13:47:26.160 回答