2016-08-21 11 views
1

私はsedで得た以下の隠し文字を含むテキストファイルを持っています。ファイルの処理中にruby​​ファイル全体から隠し文字を削除します

\033[H\033[2J\033 

私がこれによって隠された文字に

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

、viと以下のように上記のコードを見ると、ファイルを開く、いくつかの問題に直面しています。この隠された文字を処理する前にファイル全体で取り除くことはありますか?

答えて

2

ファイルのサイズが大きすぎない場合は、ファイルの内容全体を読み取り、エスケープされたすべてのシーケンスを削除することができます。

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

エスケープシーケンスパターンに従って使用される正規表現を一般化できます。あなたの例では、それは\033[の後に任意の数字とその後の文字が続きます。 32未満(" ".ord #=> 32)は以下のASCII値と非印刷文字を削除する

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

'content.gsub!(/ \ 033 \ [\ dは?[AZ] /、 '')'完璧な作業しています。ありがとうございました! 上記のようなすべての種類の隠し文字を削除したい場合は、最善の方法はありますか? – Karthi1234

+0

あなたの本当のケースに本当に依存している@Karthick、私はここで答えを与えることはできません。 –

+0

それは大丈夫と私は理解した。ご協力いただきありがとうございます! – Karthi1234

0

一つの方法:どちらがのように更新することができます。

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" 
+0

このような非表示の文字を削除するにはどうしたらいいですか? ^ [[5メートル ^ [(B ^ [[メートル ^ M 私は削除することができ、少なくとも場合^一人でその罰金。私は理解していない – Karthi1234

+0

。 ' "^"'隠しキャラクターではありません –

+0

yep申し訳ありませんでした。 – Karthi1234

関連する問題