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

8oomwypt  于 5个月前  发布在  Unix
关注(0)|答案(4)|浏览(65)

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

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

字符串
但是^@字符仍然没有被删除。我还尝试使用

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


但也无济于事
有人能提出一些替代方法来删除不可打印的字符吗?
使用了tr -cd,但它正在删除重音字符。但它们在文件中是必需的。

iqxoj9l9

iqxoj9l91#

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

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

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

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

jaxagkaj

jaxagkaj2#

首先删除所有控制字符:

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

字符串
试试你的字符串:

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


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

5jdjgkvh

5jdjgkvh3#

我花了一段时间寻找这个问题,找到了一个简单的解决方案:
ansifilter包就是这样做的,你所需要做的就是通过它输出。
在Mac上:
brew install ansifilter
然后又道:
cat file.txt | ansifilter

2nbm6dog

2nbm6dog4#

strings -1 file... > outputfile

字符串
字符串程序将获取所有可打印的字符,在本例中长度为1(参数为-1)并打印它们。它有效地删除了所有不可打印的字符。
“man strings”将提供文档。

相关问题