ruby从整个文件中删除隐藏的字符

时间:2016-08-21 03:40:27

标签: ruby

我有一个文本文件,其中包含我用sed获得的以下隐藏字符。

\033[H\033[2J\033

当我用vi打开文件并看到上面的代码时,

^[[H^[[2J^[[H^[[2J

由于这个隐藏的字符在处理文件时遇到了一些问题。在处理之前是否有任何要删除整个文件中的隐藏字符。

2 个答案:

答案 0 :(得分:2)

如果文件大小不是太大,您可以读取整个文件内容,然后删除所有转义序列。

content = File.read('your_input_file_path')
content.gsub!(/\033\[(?:H|2J)/, '')
content.split(/\r?\n/).each do |line|
  # process line
end

您可以根据转义的序列模式推广使用的正则表达式。在你的例子中,它似乎是\033[后跟一个可选数字,然后是一个字母。哪个可以更新为:

content.gsub!(/\033\[\d?[A-Z]/, '')

答案 1 :(得分:0)

一种方法是删除ASCII值小于32(" ".ord #=> 32)的非打印字符。

def remove_invisible(infile, outfile)
  File.write(outfile,
    File.read(infile).
         codepoints.
         reject { |n| n < 32 }.
         map(&:chr).
         join
  )

假设File.read(infile)返回

str = "\033[H\033[2J\033"
  #=> "\e[H\e[2J\e"

然后

a = str.codepoints
  #=> [27, 91, 72, 27, 91, 50, 74, 27] 
b = a.reject { |n| n < 32 }
  #=> [91, 72, 91, 50, 74] 
c = b.map(&:chr)
  #=> ["[", "H", "[", "2", "J"] 
c.join
  #=> "[H[2J"