0

我在文件中获取垃圾字符(<9f>,<9d><9d>)、CNTRL 字符(^Z^M)和NULLchars( ^@)。但是我能够从文件中删除CNTRLNULL字符,但无法消除垃圾字符。任何人都可以建议一种方法来删除这些垃圾字符吗?

垃圾数据的屏幕截图

使用以下命令删除控制字符:

sed 's/\x1a//g;s/\xef\xbf\xbd//g'

使用以下命令删除空字符

tr -d '\000'

另外,请建议一个命令来删除所有上述 3 种类型的 garbal 字符。

提前致谢

4

1 回答 1

2

去除“不寻常”的 unicode 字符

在您提到的评论中,您希望在保留希腊字符的同时阻止控制字符,因此下面的 tr 解决方案不适合。一种解决方案是sed提供 unicode 支持,并且它们的[[:alpha:]]类也匹配 ascii 之外的字母字符。您首先需要设置LC_CTYPE以指定哪些字符都属于该[[:alpha:]]范围。对于带元音变音的德语,例如

LC_CTYPE=de_DE.UTF-8

然后你可以用sed它来去掉所有不是字母或标点符号的东西:

sed 's/[^[:alpha:];\ -@]//g' < junk.txt

\ -@作用:它匹配空格和之间的 ascii 范围内的所有字符@(参见ascii 表。Sed有一个[[:punct:]]类,但不幸的是这也匹配了很多垃圾,所以\ -@需要。

您可能需要玩一点LC_CTYPE,将其设置为utf-8只有我可以匹配希腊字符,但不能匹配日语。

如果你只关心ascii

如果您只关心常规 ascii 字符,您可以使用tr:首先将文件转换为“每个字符一个字节”编码,因为tr不理解多字节字符,例如使用iconv.

然后,我建议您使用白名单方法(与您在问题中使用的黑名单方法相反),因为说明您想要保留的内容比您想要过滤掉的内容要容易得多。

这个命令应该这样做:

iconv -c -f utf-8 -t latin1 < junk.txt | tr -cd '\11\12\40-\176'

这条线。。

  • 转换为 latin1 (每个字符一个字节)并忽略代码点 127 以上的所有字符(这是特殊字符,但请注意,这也会去除您可能想要保留的语言中的变音符号或特殊字符之类的东西!)
  • 删除此白名单之外的所有字符:\11\12\40-\176. 那里的数字是八进制的。看看这个 ascii 表\11tab\12是回车。\40-\176是所有通常被认为是“正常”的字符
于 2017-01-17T15:52:19.317 回答