从文件中删除非显示字符

时间:2010-08-22 07:33:33

标签: bash unix shell grep

$ cat weirdo 
Lunch now?
$ cat weirdo | grep Lunch
$ vi weirdo
  ^@L^@u^@n^@c^@h^@ ^@n^@o^@w^@?^@

我有一些文件包含一些非打印字符的文字,例如^@会导致grep失败(如上所述)。

如何让grep工作?有什么方法不需要改变文件吗?

4 个答案:

答案 0 :(得分:6)

您的文件看起来像是以UTF-16编码而不是8位字符集。 '^ @'是ASCII NUL'\ 0'的表示法,通常会破坏字符串匹配。

无损处理的一种技术是使用过滤器将UTF-16转换为UTF-8,然后在输出上使用grep - 如果命令为'utf16-utf8,则假设',你写的:

utf16-utf8 weirdo | grep Lunch

作为'utf16-utf8'令人震惊的粗略近似,您可以考虑:

tr -d '\0' < weirdo | grep Lunch

这将从输入文件中删除ASCII NUL字符,并让grep对“已清理”输出进行操作。从理论上讲,它可能会给你误报;在实践中,它可能不会。

答案 1 :(得分:5)

tr命令用于:

cat weirdo | tr -cd '[:print:]\r\n\t' | grep Lunch

答案 2 :(得分:2)

您可以使用strings(1)工具取得一些成功,例如:

strings file | grep Launch

有关详细信息,请参阅man strings

答案 3 :(得分:2)

你可以尝试

awk '{gsub(/[^[:print:]]/,"") }1' file 
相关问题