Ruby 如何从文件中删除所有空字符?

Ruby 如何从文件中删除所有空字符?,ruby,regex,file,null-character,Ruby,Regex,File,Null Character,我有一个包含大量PGN chess文件的目录,我想从中删除移动时间(写为[%emt{a_number}]。我编写了以下脚本: regex = /\[.emt[^\]]+\]/ directory = "path/to/files" extension = ".pgn" Dir.chdir(directory) Dir.foreach(directory) do |file_name| file_object = File.open(file_name, "r+") conten

我有一个包含大量PGN chess文件的目录,我想从中删除移动时间(写为
[%emt{a_number}]
。我编写了以下脚本:

regex = /\[.emt[^\]]+\]/
directory = "path/to/files"
extension = ".pgn"

Dir.chdir(directory)
Dir.foreach(directory) do |file_name|
    file_object = File.open(file_name, "r+")
    contents = file_object.read
    new_contents = contents.gsub(regex, "")
    File.truncate(directory + "/" + file_name, 0)
    file_object.puts(new_contents)
    file_object.close
end

这删除了所有的移动时间,但奇怪的是,它在文件的开头追加了大量的空字符(我怀疑这个数字等于文件中的字节数)。因此我用
contents.delete(“\0”)替换了行
new\u contents=contents.gsub(regex,”
,但这只会使情况变得更糟,在文件开头添加更多的空字符。如何删除它们?

如果替换以下内容,应该可以正常工作:

File.truncate(directory + "/" + file_name, 0)
与:

File.truncate
不应应用于打开的文件(如此处所示),并且
File\u对象.truncate
后面不应跟着任何文件操作,而不是
File\u对象。关闭

如果您已经有一个要删除的空文件,请将该文件读入字符串
str
,关闭该文件,然后执行

str.delete!("\000")

然后将
str
写回文件。

与其截断文件,不如重新打开文件进行写入,因为它会自动被截断。我相信您没有指定正确的路径:

file_path = File.join(directory, file_name)
contents = File.read(file_path)  ## Previously just file_name.
new_contents = contents.gsub(regex, "")
File.open(file_path, 'w') do |file_object|
    file_object.puts(new_contents)
end
另外,您可能不想使用
put
,因为在写入二进制数据时,与写入ascii数据相比,它有一些不同:

File.write(file_path)
file_path = File.join(directory, file_name)
contents = File.read(file_path)  ## Previously just file_name.
new_contents = contents.gsub(regex, "")
File.open(file_path, 'w') do |file_object|
    file_object.puts(new_contents)
end
File.write(file_path)