免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ailms
打印 上一主题 下一主题

问 :关于 [a-z] 的问题 [复制链接]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
31 [报告]
发表于 2006-12-15 12:44 |只看该作者
梦兄,你可以试试用ls -U取消排序,那LC_COLLATE的值就没有影响了。

论坛徽章:
0
32 [报告]
发表于 2006-12-15 13:02 |只看该作者
这么复杂啊,还不如就用正则,懒得想那么多了

论坛徽章:
0
33 [报告]
发表于 2006-12-15 13:04 |只看该作者
  1. LC_COLLATE=C ls *
复制代码

其实确实被解释成了
  1. LC_COLLATE=C ls a A b B c C
复制代码

大家直接执行下上面这句,会发现输出为
  1. A B C a b c
复制代码

可见,只是LC_COLLATE=C影响了ls的行为,并非影响了*的扩展

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
34 [报告]
发表于 2006-12-15 13:08 |只看该作者
楼上讲的有理

论坛徽章:
0
35 [报告]
发表于 2006-12-15 13:34 |只看该作者
我在unixware上试过是可以的,LANG=C。

论坛徽章:
0
36 [报告]
发表于 2006-12-15 13:55 |只看该作者
又发现有点不对劲了。

  1. [root@home test]# ksh

  2. # locale
  3. LANG=zh_CN.GB18030
  4. LC_CTYPE="zh_CN.GB18030"
  5. LC_NUMERIC="zh_CN.GB18030"
  6. LC_TIME="zh_CN.GB18030"
  7. LC_COLLATE="zh_CN.GB18030"
  8. LC_MONETARY="zh_CN.GB18030"
  9. LC_MESSAGES="zh_CN.GB18030"
  10. LC_PAPER="zh_CN.GB18030"
  11. LC_NAME="zh_CN.GB18030"
  12. LC_ADDRESS="zh_CN.GB18030"
  13. LC_TELEPHONE="zh_CN.GB18030"
  14. LC_MEASUREMENT="zh_CN.GB18030"
  15. LC_IDENTIFICATION="zh_CN.GB18030"
  16. LC_ALL=

  17. # ls [a-z]*
  18. a12

  19. # ls
  20. 123  A  a12
  21. #
复制代码


如果按照 bash 的manual 所说的,和当前 locale 的 LC_COLLATE 和字符集有关,

那么为什么上面的 ksh 又可以呢?

locale 输出的结果还是和 bash 的一样啊

论坛徽章:
0
37 [报告]
发表于 2006-12-15 14:00 |只看该作者
因为ksh没有采用这种机制 ^__^
我们看到的是bash的手册页,不是ksh的,不是么?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
38 [报告]
发表于 2006-12-15 14:32 |只看该作者
原帖由 一梦如是 于 2006-12-15 13:04 发表
  1. LC_COLLATE=C ls *
复制代码

其实确实被解释成了
  1. LC_COLLATE=C ls a A b B c C
复制代码

大家直接执行下上面这句,会发现输出为
  1. A B C a b c
复制代码

可见,只是LC_COLLATE=C影响了ls的行为,并非影响了*的扩展

梦兄这句容易产生误解,我再强调一下:准确地说是在
LC_COLLATE=C ls
这样的命令中才能这样讲。
可以肯定地说:环境变量LC_COLLATE的值是一定会影响字符排序的顺序的,进而也会对
[a-z]
这样统配符的扩展结果产生影响。如17楼用了export LC_COLLATE=C的例子。关于如何如何影响[a-z]这样的的扩展在BASH FAQ的E9中讲的很清楚。
只是在LC_COLLATE=C ls这种特定的场合下,LC_COLLATE=C的赋值生效是在统配符扩展之后,还来不及对之前已经完成的统配符扩展这一步操作产生影响罢了。

[ 本帖最后由 woodie 于 2006-12-15 14:55 编辑 ]

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
39 [报告]
发表于 2006-12-15 14:58 |只看该作者
就是说不是不能影响shell扩展,而是没有来得及。
精彩的讨论,又有收获了。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
40 [报告]
发表于 2006-12-15 15:45 |只看该作者
是的,所以很多要處理文字的程式,為了避免語系的差異,會先行定義 LANG
如 LANG=C proman parameters.....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP