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

问题描述 投票:0回答:4

我正在尝试从文件中的记录中删除不可打印的字符(例如

^@
)。由于文件中的记录量太大,因此不适合使用 cat ,因为循环花费了太多时间。 我尝试使用

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

^@
字符仍然没有被删除。 我也尝试使用

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

但这也没有帮助。

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

使用

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

bash unix awk sed non-printing-characters
4个回答
24
投票

也许您可以使用

[:print:]
的补集,其中包含所有可打印字符:

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

如果您的

tr
版本不支持多字节字符(似乎很多不支持),这对我来说适用于 GNU sed(使用 UTF-8 区域设置):

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

4
投票

先删除所有控制字符:

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

然后尝试你的字符串:

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

我相信你所看到的

^@
实际上是一个零值
\0

上面的
tr
过滤器也会删除这些内容。


1
投票

搜索这个有一段时间并找到了一个相当简单的解决方案:

ansifilter
正是这样做的。您所需要做的只是通过它传输输出。

在 Mac 上:

brew install ansifilter

然后:

cat file.txt | ansifilter


0
投票
strings -1 file... > outputfile

似乎有效。 strings 程序将获取所有可打印字符,在本例中长度为 1(-1 参数)并打印它们。它有效地删除了所有不可打印的字符。

“man strings”将提供文档。

© www.soinside.com 2019 - 2024. All rights reserved.