grep 或 sed 无法识别某些 UTF-8 字符

Yim*_*ong 6 grep sed unicode locale

试图确定文件中的所有字符。

该文件sample包括:

a e?
abandon ??bænd?n
ability ??b?l?ti
able ?e?b?l
able ?e?bl
abortion ??b?r??n
abortion ??b?r?n
about ??ba?t
above ??b?v
abroad ??br?d
Run Code Online (Sandbox Code Playgroud)

确认语言环境正确:

$ echo $LANG

en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)

获取第二个字段的命令,按字符拆分,然后计算数量:

$ cat sample | awk '{print $2}' | grep -o . | sort | uniq -c | sort -n

  1 a
  1 æ
  1 i
  1 v
  2 d
  2 t
  3 e
  3 l
  3 ?
  3 r
  4 n
  9 b
 11 ?
 17 ?
Run Code Online (Sandbox Code Playgroud)

?和在哪里??它们没有组合字符或任何特殊的东西。请注意,其他 UTF-8 字符被拉出:例如???

顺便说一句, usingsed 's/\(.\)/\1\n/g'的结果与 几乎相同grep -o .,只是它为“\n”添加了一行。

有什么我想念的吗?grep 有隐藏的 UTF-8 选项吗?

如果重要,我正在使用Ubuntu 12.04.2 LTS.

cho*_*oba 3

问题在于sort并且uniq正在使用区域设置的排序规则信息。关闭两个命令的区域设置是有效的:

\n\n
cat sample | awk '{print $2}' | grep -o . | LC_ALL=C sort | LC_ALL=C uniq -c | sort -n\n      1 \xca\x8a\n      1 \xca\x8c\n      1 a\n      1 \xc3\xa6\n      1 i\n      1 v\n      2 \xca\x83\n      2 d\n      2 t\n      3 e\n      3 l\n      3 \xc9\x94\n      3 r\n      4 \xc9\xaa\n      4 n\n      9 \xcb\x88\n      9 b\n     11 \xc9\x99\n
Run Code Online (Sandbox Code Playgroud)\n

  • @derobert,是的“U0234”到“U07FF”都​​一样(glibc 2.17)。那是不对的。 (3认同)
  • 好吧,我想 `sort` 不能保证相同的(如字节到字节)行是相邻的,所以 `uniq` _has_ 在那里使用 `strcoll` 。所以你的回答完全切中要点。遗憾的是,每当我们需要使用 `uniq` 时,我们都必须将 `uniq` **和 sort** 的 LC_ALL 设置为 C。 (2认同)