我正在运行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.这里发生了什么?
表达本身对我有用:
dfs:~# gawk --posix '/^[A-Z]{2,4}$/ {print "Yes"}' AAAA Yes AA Yes TT Yes tt YY Yes yy
你的问题可能是由两件事引起的.您不小心设置了IGNORECASE
awk变量或以其他方式转换为不区分大小写的操作(BTW IGNORECASE
不起作用--posix
,但确实如此--re-interval
,这也启用了正则表达式中的大括号),或者它是区域设置整理顺序的典型问题(因为gawk确实如此)区域设置感知字符比较),这意味着小写字符在一些大写字符之间进行比较.从手册的相关部分引用:
许多语言环境按字典顺序对字符进行排序,在这些语言环境中,'[a-dx-z]'通常不等同于'[abcdxyz]'; 相反,它可能等于'[aBbCcDdxXyYz]',例如.要获得括号表达式的传统解释,可以通过将LC_ALL环境变量设置为值"C"来使用C语言环境.