2015-12-22 45 views
0

我試圖從我的文件中的記錄中刪除不可打印的字符(例如^@)。由於使用cat的記錄體積太大,因爲循環花費的時間太長,所以不是一個選項。 我嘗試使用嘗試從UNIX文件中刪除不可打印的字符(垃圾值)

sed -i 's/[^@a-zA-Z 0-9`[email protected]#$%^&*()_+\[\]\\{}|;'\'':",.\/<>?]//g' FILENAME 

但仍^@字符不會被刪除。 我也嘗試過使用

awk '{ sub("[^a-zA-Z0-9\"[email protected]#$%^&*|_\[](){}", ""); print } FILENAME > NEW FILE 

,但它也沒有幫助。

任何人都可以建議一些替代方法來刪除不可打印的字符?

使用tr -cd但它是刪除重音字符。但它們在文件中是必需的。

+0

使用哪種語言(unix參數)? – NeronLeVelu

+0

已在unix框中創建了正常的/ bin/sh腳本。該腳本將運行一個包含2500萬條記錄的文件,並從數據庫獲取數據。但是這個腳本會忽略具有垃圾值的記錄。 – Pranav

+0

如果您看到很多NULL(0x00,\ 0000)字符,則可能是某種多字節編碼。 **如果**是這種情況,那麼這些不是「垃圾」字符。 **我知道要檢查的最簡單的方法是將文件或其某些部分加載到'emacs'中。 –

回答

0

也許你可以用[:print:]補充,其中包含所有可打印字符去:

tr -cd '[:print:]' <file> newfile 

如果你的的tr版本不支持多字節字符(似乎很多都沒有),這對我的作品與GNU的sed(使用UTF-8區域設置):

sed 's/[^[:print:]]//g' file 
+0

Tom,這些將刪除文件中存在的ascented字符。所以這個選項也沒有幫助。 – Pranav

+0

看起來你是對的 - 我添加了另一個適用於我的選項。 –

0

首先刪除所有控制字符:

tr -dc '\007-\011\012-\015\040-\376' <file> newfile 

然後試試你的字符串:

sed -i 's/[^@a-zA-Z 0-9`[email protected]#$%^&*()_+\[\]\\{}|;'\'':",.\/<>?]//g' newfile 

我相信你所看到的^@實際上是在零值\0
從上面的tr過濾器也將刪除這些。