我经常使用这个命令:
LC_ALL=C.UTF-8 egrep -laxv '.*' filename
这会告诉我文件是否包含任何非 UTF8 字符(实际上我通常将其find
与一次扫描多个文件结合使用)
我可以删除-l
以获取包含 UTF-8 字符的实际行,而不仅仅是文件名,这通常就足够了,我通常可以查看该行并找出问题字符
然而,我目前正在处理一个包含非常长行的文件,而且我还无法仅通过目测来找到有问题的字符
我想修改 grep 命令以仅打印出非 UTF8 字符而不是整行
不幸的是,-o
这没有帮助,因为这是一次-v
负面匹配
我还不想删除这个角色,我只是想弄清楚它是哪个角色
我尝试了类似“LC_ALL=C.UTF-8 egrep -ao '[^.]'之类的操作,但是字符组内的“。”按字面意思处理,所以它什么也不做,只是输出文件中不是“。”的每个字符。
如果我要搜索非 ASCII 字符,我知道我可以使用[[:ASCII:]]
字符类,但似乎没有与 UTF-8 等效的字符类
我尝试在问题文件中搜索'[^[[:print:]]]'
,但没有找到任何内容
我尝试了其他方法,例如通过 UTF-8 转换器运行文件并将其与原始文件进行比较,但它们都声称该文件已经完全是 UTF-8。我想我可能正在处理 grep 中的一个错误,它导致有效的 UTF-8 字符被检测为无效,但是,为了进一步调查,我需要知道哪个字符是实际问题
之前处理另一个文件时,我反复试验,确定(对于那个特定的文件)韩语字符 획 是问题的根源。对于我现在处理的文件,里面有很多韩语,但是没有 획 的实例,所以这次一定是另一个字符导致了问题。我之前处理的文件只有 4 个韩语字符,所以很容易找出哪个是问题的原因,但我正在处理的文件包含更多,我真的不想通过反复试验来解决这个问题