$ cat weirdo
Lunch now?
$ cat weirdo | grep Lunch
$ vi weirdo
^@L^@u^@n^@c^@h^@ ^@n^@o^@w^@?^@
我有一些文件包含一些非打印字符的文字,例如^@
会导致grep
失败(如上所述)。
如何让grep
工作?有什么方法不需要改变文件吗?
答案 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