当我想要递归搜索 TeX 文件中我的字体不支持的字符时,我通常会从搜索不可破坏的空格和零宽度空格开始。这些很难在终端命令行上生成,因此我使用它们的 UTF-8 十六进制表示形式。
env LANG=C grep -obUaP "\xc2\xa0" $(find -name '*.tex')
env LANG=C grep -obUaP "\xe2\x80\x8b" $(find -name '*.tex')
为什么我需要显式地将LANG
环境变量设置为C
如上所示:env LANG=C
笔记
同时使用-U
and-a
可能看起来是错误的,但是此版本的手册指出
当 type 为“binary”时,即使没有 -z (--null-data) 选项,grep 也可能将非文本字节视为行终止符。
-a
仅强制行终止符成为行终止符(不太清楚)。
http://www.gnu.org/software/grep/manual/html_node/File-and-Directory-Selection.html
答案1
我的 grep 手册版本不包含此内容,但 grep 3.0 对此主题进行了详细说明。
警告: -a (--binary-files=text) 选项可能会输出二进制垃圾,如果输出是终端并且终端驱动程序将其中一些解释为命令,则可能会产生严重的副作用。另一方面,当读取文本编码未知的文件时,使用 -a 或在环境中设置 'LC_ALL='C'' 会很有帮助,以便找到更多匹配项,即使这些匹配对于直接不安全展示。
从这个答案:https://unix.stackexchange.com/a/87763/33386
在 C 语言环境中,字符是单字节,字符集是 ASCII [...]
这可能就是为什么这有助于在扫描未知文本文件时显示字符的原因。它强制使用 ASCII 字符集。