AWK - 我的正则表达式不会尊重案例

时间:2009-02-20 06:14:46

标签: ubuntu awk case-sensitive case-insensitive gawk

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

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

我很快发现没有--posix开关,{n}表达式在gawk中不起作用。一旦启用,表达式就可以工作,但它与caseA insenitive匹配AAAA和aaaa。这是怎么回事?

3 个答案:

答案 0 :(得分:5)

表达本身对我有用:

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

你的问题可能是由两件事引起的。您不小心设置了IGNORECASE awk变量或以case insensitive operation方式转换(BTW IGNORECASE不适用于--posix,但--re-interval适用{{1}}正则表达式中的大括号),或者它是区域设置整理顺序的经典问题(因为gawk进行区域设置识别字符比较),这意味着小写字符在一些大写字符之间进行比较。引自relevant part of the manual:

  

许多语言环境对字符进行排序   字典顺序,并在这些   locales,'[a-dx-z]'通常不是   相当于'[abcdxyz]';相反   可能相当于   例如'[aBbCcDdxXyYz]'。至   获得传统的解释   括号表达式,你可以使用   通过设置LC_ALL来设置C语言环境   环境变量为'C'。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

% awk '{print /[:upper:]/?"OK":"KO"}'
AA
KO
aa
KO