我想列出字符é
的文件我执行此命令:
ls -l | grep é
并没有结果。目录内容:
-rw-r--r-- 1 user staff 5020 3 may 11:48 begin
-rw-r--r-- 1 user staff 0 13 jun 08:47 canté
-rw-r--r-- 1 user staff 0 13 jun 08:47 centré
-rw-r--r-- 1 user staff 5020 3 may 11:48 end
语言环境配置
LANG="es_ES.UTF-8"
LC_COLLATE="es_ES.UTF-8"
LC_CTYPE="es_ES.UTF-8"
LC_MESSAGES="es_ES.UTF-8"
LC_MONETARY="es_ES.UTF-8"
LC_NUMERIC="es_ES.UTF-8"
LC_TIME="es_ES.UTF-8"
LC_ALL=
在Mac Os X 10.7.3上运行命令。有什么不对吗?
答案 0 :(得分:5)
像“é”这样的字符可以用两种不同的方式用Unicode表示。它可以是一个单独的,预先组合的Unicode字符,带有ACUTE U + 00E9的LATIN SMALL LETTER E,或者它可以分解为两个字符,LATIN SMALL LETTER E U + 0065,然后是COMBINING ACUTE ACCENT U + 0301。
在Mac OS X上,文件系统API始终规范化为规范化表格D(NFD)的特殊变体。在适当的NFD中,所有可以分解的字符都是。在Mac OS X文件系统API使用的NFD变体中,某些字符是预先组合的,以便与旧版卷向后兼容。
无论如何,我怀疑在终端中输入的字符的表单与ls
输出的表单不同。我会比较ls -l | hexdump -C
和echo -n é | hexdump -C
之间的差异。 (在这两种情况下,你都会获得UTF-8。因此,U + 00e9将显示为c3 a9,而U + 0065 U + 0301将显示为65 cc 81.)
更新:通过一些测试,我发现这有效:
ls -l | grep $(printf "e\xcc\x81")
这与sarnold的建议类似,也有效:
ls -l *$(printf "e\xcc\x81")*
基本上,我在子shell中使用printf
作为输入文件名中使用的精确字节序列的方法。以正常方式键入字符会产生不匹配的不同字节序列。
答案 1 :(得分:1)
我找到了一个有效的解决方案:
ls -l | iconv -f UTF-8-MAC -t UTF-8 | grep é