私は恐ろしいテキストデータ(2GBのcsvファイル)から作業しています。実際にはすべてのエスケープ文字0x00-0x1Fがファイル全体に含まれています。私は(0x04の)処理のためにRにこれを読んしようとしましたが、のEOFに起因することはできません。sedのエスケープ/非印字可能な文字の範囲を削除
Warning message:
In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
EOF within quoted string
だから私は、sedのは、ファイル内のすべての非印刷可能なジャンクを削除するには良いの使用だろうと思ったが、そこに思えますsedの構文でエスケープ文字をどのように表現するかには、ある種の不自然さがあります。私は仕事していないようですこれ以下の全てを試してみました:
cat IN.csv | sed 's/[\d0-\d31]//g' > OUT.csv
cat IN.csv | sed s/[$'\x00'-$'\x1F']//g OUT.csv
cat IN.csv | sed 's/\x00-\x1F//g' > OUT.csv
と使用:
sed 's/[^a-zA-Z 0-9`[email protected]#$%^&*()_+\[\]\\{}|;'\'':",.\/<>?]//g' IN.csv > OUT.csv
は、10進数または16進数で印刷不能の範囲を特定します
は、必ず指定の文字を含めますCtrl-VCtrl-Dこれを生成するために:
cat IN.csv | sed s/^D//g > OUT.csv
すべてのコマンドが実行されたように見えますが、結果のファイル出力では印刷できない文字は削除されず、予期しない方法で出力が変更されるようです。
cat IN.csv | sed 's/'`echo -e "\x04"`'//g' > OUT.csv
またはこの:
cat IN.csv | sed 's/\x04//g' > test3.csv
シングルエスケープ文字のためしかし、これだけ作品、私はそれが仕事をする見つけたもの
はこれです。 1つの範囲内で同時に印刷不可能な文字をすべて解決するには、印刷できない文字ごとに1つのコマンドを実行する必要はありませんか?私は、範囲の構文を正しく入力してはならないと仮定します。
'[^ - 〜\ t \ r \ n]'のようなものを試しましたか?または '[^ [:space:]! - 〜]' –
印字可能な文字にPOSIX文字クラスの否定を使用しようとしましたか: ''/[^ [:print:]] // g '文字 '/ s [[:cntrl:]] // g''? –
ありがとうございます。 s/[[:cntrl:]] // g 'も動作するように見えましたが、このバージョンと[:print:]バージョンのファイルサイズは少し異なります。私はそれらの違いを調べる必要があるかもしれません。 –