$ cat weirdo
Lunch now?
$ cat weirdo | grep Lunch
$ vi weirdo
^@L^@u^@n^@c^@h^@ ^@n^@o^@w^@?^@
我有一些文件包含一些非打印字符的文本,如
^@
导致我的 grep
失败(如上)。我怎样才能让我的
grep
工作?有什么方法不需要更改文件吗? 最佳答案
看起来您的文件是用 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
对“清理过的”输出进行操作。理论上,它可能会给你误报;在实践中,它可能不会。关于bash - 从文件中删除非显示字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3540582/