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.
问题在于sort并且uniq正在使用区域设置的排序规则信息。关闭两个命令的区域设置是有效的:
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\nRun Code Online (Sandbox Code Playgroud)\n