$ 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/

10-14 14:19
查看更多