9

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

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

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

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

但这也无济于事。

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

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

4

4 回答 4

16

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

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

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

sed 's/[^[:print:]]//g' file
于 2015-12-22T09:48:15.413 回答
4

首先删除所有控制字符:

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

然后试试你的字符串:

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

我相信你看到^@的其实是一个零值\0
上面的tr过滤器也将删除这些。

于 2015-12-22T15:03:04.557 回答
0
strings -1 file... > outputfile

似乎工作。字符串程序将获取所有可打印的字符,在这种情况下长度为 1(-1 参数)并打印它们。它有效地删除了所有不可打印的字符。

“man strings”将提供文档。

于 2019-11-05T22:38:09.990 回答
0

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

该软件包ansifilter正是这样做的。您需要做的只是通过它管道输出。

在 Mac 上:

brew install ansifilter

然后:

cat file.txt | ansifilter

于 2021-11-02T18:26:07.333 回答