尝试从UNIX文件中删除不可打印的字符(垃圾值)

时间:2015-12-22 09:44:28

标签: bash unix awk sed non-printing-characters

我正在尝试从文件中的记录中删除不可打印的字符(例如^@)。由于文件中的记录量太大,使用cat不是一个选项,因为循环花费了太多时间。 我尝试使用

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

但仍未删除^@个字符。 我也尝试使用

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

但它也没有帮助。

有人可以提出一些替代方法来删除不可打印的字符吗?

使用tr -cd,但它删除了重音字符。但它们在文件中是必需的。

3 个答案:

答案 0 :(得分:4)

也许您可以使用[:print:]的补码,其中包含所有可打印的字符:

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

如果您的tr版本不支持多字节字符(似乎很多字符不支持),这适用于GNU sed(使用UTF-8语言环境设置):

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

答案 1 :(得分:2)

首先删除所有控制字符:

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

然后尝试你的字符串:

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

我相信您看到^@的内容实际上是零值\0 上面的tr过滤器也会将其删除。

答案 2 :(得分:0)

strings -1 file... > outputfile

似乎可以工作