如何搜索二进制文件并用Ruby替换字符串?

时间:2011-11-03 14:38:20

标签: ruby windows security replace

Ruby新手在这里。我正在使用Ruby版本1.9.2。我在军事设施工作,每当需要向我们的供应商发送支持数据时,需要清除识别IP和主机名信息。这对我来说是新角色,现在处理支持问题时,擦除文件(文本和二进制文件)的任务就落到了我身上。

我创建了以下脚本来“清理”文件IP地址信息的纯文本文件:

File.open("subnet.htm", 'r+') do |f|
  text = f.read
  text.gsub!(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/, "000.000.000.000")
  f.rewind
  f.write(text)
end

我需要修改我的脚本来搜索和替换文本文件和.dat二进制文件的主机名和IP地址信息。我正在寻找像我上面的小脚本一样非常简单的东西,我希望将txt和dat文件的处理保持为单独的脚本。创建一个脚本来完成这两个任务的任务是我想从两个单独的脚本中学习练习。现在我在一定的时间限制下擦洗支持文件并将其发送出去。

我的优先级是擦除数据类型为XML的二进制.dat跟踪文件。这些是来自我们的存储阵列的二进制性能跟踪文件,他们需要在发送支持分析之前清除识别的IP地址信息。

我在某种程度上搜索了stackoverflow.com并且没有找到解决我特定需求的答案的问题,而我只是有时间试图弄清楚string.unpack。

感谢。

2 个答案:

答案 0 :(得分:2)

一般情况下,Ruby处理二进制文件与其他文件相同,但有两点需要注意:

  1. 在Windows上读取文件通常会将CRLF对转换为LF。您需要以二进制模式读取以确保无转换:

    File.open('foo.bin','rb'){ ... }
    
  2. 为了确保您的二进制数据不被解释为Ruby 1.9+下的某些其他编码中的文本,您需要指定ASCII-8BIT编码:

    File.open('foo.bin','r:ASCII-8BIT'){ ... }
    

    但是,如上所述in this post,如上所示设置'b'标志也会为您设置编码。因此,只需使用上面的第一个代码段即可。

  3. 但是,正如@ennuikiller的评论所指出的那样,我怀疑你实际上没有真正的二进制数据。如果您真的正在阅读使用非ASCII编码的文本文件(例如UTF-8),那么将它们视为二进制文件的可能性很小,只会偶然发现一半的多字节编码,并对生成的文件造成损害。 / em>的

    编辑:要在XML文件上使用Nokogiri,您可能会执行以下操作:

    require 'nokogiri'
    File.open("foo.xml", 'r+') do |f|
      doc = Nokogiri.XML(f.read)
      doc.xpath('//text()').each do |text_node|
        # You cannot use gsub! here
        text_node.content = text_node.content.gsub /.../, '...'
      end
      f.rewind
      f.write doc.to_xml
    end
    

答案 1 :(得分:1)

我已经完成了一些二进制文件解析,这就是我读取它并清理它的方式:

data = File.open("file", 'rb' ) {|io| io.read}.unpack("C*").map do |val| 
  val if val == 9 || val == 10 || val == 13 || (val > 31 && val < 127) 
end

对我来说,我的二进制文件没有连续的字符串,所以在我阅读它之前我必须进行一些移位和过滤(因此.map do |val| ... end使用"C"标签解压缩(参见http://www.ruby-doc.org/core-1.9.2/String.html#method-i-unpack)将提供ASCII字符代码而不是字母,因此如果您想要使用解释后的字符,请调用val.chr

我建议您在二进制编辑器中打开文件并查看它们以确定如何最好地处理数据解析。如果它们是XML,您可以考虑使用Nokogiri或类似的XML工具解析它们。