从文件中删除非显示字符

Laz*_*zer 3 unix bash shell grep

$ cat weirdo 
Lunch now?
$ cat weirdo | grep Lunch
$ vi weirdo
  ^@L^@u^@n^@c^@h^@ ^@n^@o^@w^@?^@
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能得到我的grep工作?有什么方法不需要改变文件?

Jon*_*ler 6

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

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

utf16-utf8 weirdo | grep Lunch
Run Code Online (Sandbox Code Playgroud)

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

tr -d '\0' < weirdo | grep Lunch
Run Code Online (Sandbox Code Playgroud)

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

  • 我不知道utf16-utf8,但`iconv`应该随处可用:`iconv -f UTF-16 -t UTF-8 weirdo` (2认同)

use*_*621 5

tr命令是为此:

cat weirdo | tr -cd '[:print:]\r\n\t' | grep Lunch
Run Code Online (Sandbox Code Playgroud)