"非法字节序列"在bash中,我该如何找到它?

时间:2014-11-20 22:28:49

标签: bash vim

当我尝试在osx(bash)上对文本文件进行排序时,我收到以下错误:

sort: string comparison failed: Illegal byte sequence
sort: Set LC_ALL='C' to work around the problem.
sort: The strings compared were ‘\363\272\331DR\371’ and ‘201310’.

网络上有很多建议将LC_ALL设置为错误建议。但是,我想找到这个非法字节序列的位置。

我解析来自许多第三方的数据,在将其写入单个文件之前进行各种规范化,最终将其上传到数据库。此数据中应该没有花哨的字符,并且此错误告诉我在此过程中的某处存在损坏。但是,我无法找到它!

我试图分开'文件变得越来越小,所以我可以在视觉上找到角色,但我不能。我无法轻视它,在vim或sublimetext中找到它。

我是如何找到这种腐败现象的?

1 个答案:

答案 0 :(得分:1)

这个对你有帮助吗?

grep -n $(echo -e '\0363\0272\0331DR\0371') filename

要自动执行操作,您可以考虑修改源代码

的coreutils-8.23 / LIB / xmemcoll.c

static void
collate_error (int collation_errno,
               char const *s1, size_t s1len,
               char const *s2, size_t s2len)
{
  error (0, collation_errno, _("string comparison failed"));
  error (0, 0, _("Set LC_ALL='C' to work around the problem."));
  error (exit_failure, 0,
         _("The strings compared were %s and %s."),
         quotearg_n_style_mem (0, locale_quoting_style, s1, s1len),
         quotearg_n_style_mem (1, locale_quoting_style, s2, s2len));
}

至少通过这种方式,您可以轻松编写垃圾桶文件,将所有这些行放入检查中。