0

我正在运行 Ubuntu 8.04,我的代码看起来像这样......

 for (i=1;i<=n;i++)
 {
  if (arr[i] ~ /^[A-Z]{2,4}$/) printf(arr[i])
 }

我很快发现如果没有 --posix 开关,{n} 表达式将无法在 gawk 中工作。一旦启用,表达式就可以工作,但它是不区分大小写的匹配 AAAA 和 aaaa。这里发生了什么?

4

3 回答 3

5

表达式本身对我有用:

dfs:~# gawk --posix '/^[A-Z]{2,4}$/ {print "Yes"}'
AAAA
Yes
AA
Yes
TT
Yes
tt
YY
Yes
yy

您的问题可能是由两件事引起的。要么您不小心设置了IGNORECASEawk 变量,要么以其他方式关闭了不区分大小写的操作(BTWIGNORECASE不适用于--posix,但可以使用--re-interval,这也启用了正则表达式中的大括号),或者这是语言环境整理序列的经典问题(因为 gawk 确实语言环境感知字符比较),这意味着小写字符在一些大写字符之间进行比较。从手册的相关部分引用:

许多语言环境按字典顺序对字符进行排序,在这些语言环境中,'[a-dx-z]' 通常不等同于 '[abcdxyz]';例如,它可能等同于“[aBbCcDdxXyYz]”。要获得括号表达式的传统解释,您可以通过将 LC_ALL 环境变量设置为值“C”来使用 C 语言环境。

于 2009-02-20T10:38:06.077 回答
0

我只安装了 mawk,但也许这就是你要找的?

for (i=1;i<=n;i++) { if (arr[i] ~ [^AZ]{2,4}$/) printf(arr[i]) }

于 2009-02-20T07:57:45.053 回答
0

否则,如果您使用GNU awk,则可以使用[:upper:]字母字符类。

% awk '{print /[:upper:]/?"OK":"KO"}'
AA
KO
aa
KO
于 2009-03-19T19:36:45.663 回答