[英]Trying to remove non-printable characters (junk values) from a UNIX file
我正在嘗試從我的文件中的記錄中刪除不可打印的字符(例如^@
)。 由於文件中的記錄量太大,使用 cat 不是一種選擇,因為循環花費了太多時間。 我嘗試使用
sed -i 's/[^@a-zA-Z 0-9`~!@#$%^&*()_+\[\]\\{}|;'\'':",.\/<>?]//g' FILENAME
但仍然沒有刪除^@
字符。 我也嘗試使用
awk '{ sub("[^a-zA-Z0-9\"!@#$%^&*|_\[](){}", ""); print } FILENAME > NEW FILE
但這也無濟於事。
有人可以建議一些替代方法來刪除不可打印的字符嗎?
使用tr -cd
但它正在刪除重音字符。 但它們在文件中是必需的。
也許你可以使用[:print:]
的補充,它包含所有可打印的字符:
tr -cd '[:print:]' < file > newfile
如果您的tr
版本不支持多字節字符(似乎很多不支持),這對我來說適用於 GNU sed(使用 UTF-8 語言環境設置):
sed 's/[^[:print:]]//g' file
首先刪除所有控制字符:
tr -dc '\007-\011\012-\015\040-\376' < file > newfile
然后試試你的字符串:
sed -i 's/[^@a-zA-Z 0-9`~!@#$%^&*()_+\[\]\\{}|;'\'':",.\/<>?]//g' newfile
我相信你看到的^@
實際上是一個零值\\0
。
上面的tr
過濾器也將刪除這些。
strings -1 file... > outputfile
似乎工作。 字符串程序將獲取所有可打印的字符,在這種情況下長度為 1(-1 參數)並打印它們。 它有效地刪除了所有不可打印的字符。
“人字符串”將提供文檔。
搜索了一段時間並找到了一個相當簡單的解決方案:
ansifilter
包正是這樣做的。 您需要做的就是通過它管道輸出。
在 Mac 上:
brew install ansifilter
然后:
cat file.txt | ansifilter
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.