免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
11 [报告]
发表于 2006-12-15 09:56 |只看该作者
ailms说的没错,shell中没有正则,只有wildcard 。
这里有几个例子可以体会一下[a-z](其实并不等价于26个小写字母):
ls [a-z]*
LANG=C ls [a-z]*
ls [abcdefghijklmnopqrstuvwxyz]*

论坛徽章:
0
12 [报告]
发表于 2006-12-15 09:59 |只看该作者
在补充两句: bash默认下[a-z]貌似会匹配[A-Z].

而AIX默认应该是ksh, ksh的[a-z] 是不会有这个问题的. csh也没有问题. cat /etc/shells 然后用这些shell都试试.

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
13 [报告]
发表于 2006-12-15 10:10 |只看该作者
楼上说的没错,pdksh, AT&T ksh 93, zsh, ash/bsh都没有这个问题。难道是bash的feature?

论坛徽章:
0
14 [报告]
发表于 2006-12-15 10:17 |只看该作者
原帖由 r2007 于 2006-12-15 09:56 发表
ailms说的没错,shell中没有正则,只有wildcard 。
这里有几个例子可以体会一下[a-z](其实并不等价于26个小写字母):
ls [a-z]*
LANG=C ls [a-z]*
ls [abcdefghijklmnopqrstuvwxyz]*

哦,是我弄错了。那 Wildcard 用得还能放心了?

论坛徽章:
0
15 [报告]
发表于 2006-12-15 10:21 |只看该作者
原帖由 awk就是awp加ak 于 2006-12-15 10:17 发表

哦,是我弄错了。那 Wildcard 用得还能放心了?


看起来bash的不太放心, 手头有FreeBSD可以试试sh有没有这个问题...
另一种就是用find来弄...貌似find 比较聪明!, ^都支持...

论坛徽章:
0
16 [报告]
发表于 2006-12-15 10:59 |只看该作者
看来还是用 find 比较放心啊

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
17 [报告]
发表于 2006-12-15 11:35 |只看该作者
原帖由 woodie 于 2006-12-15 10:10 发表
楼上说的没错,pdksh, AT&T ksh 93, zsh, ash/bsh都没有这个问题。难道是bash的feature?

这个还真的不是BUG,bash这样只是为了更加符合POSIX标准。
解决的方法是:先把环境变量LC_COLLATE 设为C并输出:
export LC_COLLATE=C
然后[a-z]就不会匹配大写字母了。
但奇怪的是将LC_COLLATE=C写在命令行的开始并不会发生效果,如单单这样就不行:
LC_COLLATE=C ls [a-z]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
18 [报告]
发表于 2006-12-15 11:47 |只看该作者
奇怪的是这样又可以:
LC_COLLATE=C bash
[under sub shell]$ ls [a-z]

论坛徽章:
0
19 [报告]
发表于 2006-12-15 11:52 |只看该作者
原帖由 woodie 于 2006-12-15 11:47 发表
奇怪的是这样又可以:
LC_COLLATE=C bash
[under sub shell]$ ls [a-z]



帅哥为什么不加个分号??
LC_COLLATE=C; ls [a-z]

论坛徽章:
0
20 [报告]
发表于 2006-12-15 11:56 |只看该作者
原帖由 woodie 于 2006-12-15 11:35 发表
这个还真的不是BUG,bash这样只是为了更加符合POSIX标准。

这句说的对。
至于为什么bash会这么扩展,请看从man bash中摘抄的内容:
       [...]  Matches  any  one of the enclosed characters.  A pair of charac-
              ters separated by a hyphen denotes a range expression; any char-
              acter  that sorts between those two characters, inclusive, using
              the current locale’s collating sequence and  character  set,  is
              matched.   If the first character following the [ is a !  or a ^
              then any character not enclosed is matched.  The  sorting  order
              of  characters in range expressions is determined by the current
              locale and the value of the LC_COLLATE shell variable,  if  set.
              A  - may be matched by including it as the first or last charac-
              ter in the set.  A ] may be matched by including it as the first
              character in the set.

注意这里所说的sort
  1. ls -1
  2. a
  3. A
  4. b
  5. B
  6. c
  7. C
复制代码

看到这里,大家明白为什么默认情况下bash的[a-z]会扩展出大写字符了吧?

PS:给网中人兄的十三问挑个错,[!...]和[^...]并非Wildcard 与 Regular Expression 的差別,事实上,可以认为它们并无差别。在这个语境里,它们都是Wildcard的部分,而且扩展效果也没有任何不同。网中人那篇文章整体没错,但文章题目似乎有误。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP