我正在运行 Ubuntu 8.04,我的代码看起来像这样......
for (i=1;i<=n;i++)
{
if (arr[i] ~ /^[A-Z]{2,4}$/) printf(arr[i])
}
我很快发现如果没有 --posix 开关,{n} 表达式将无法在 gawk 中工作。一旦启用,表达式就可以工作,但它是不区分大小写的匹配 AAAA 和 aaaa。这里发生了什么?
我正在运行 Ubuntu 8.04,我的代码看起来像这样......
for (i=1;i<=n;i++)
{
if (arr[i] ~ /^[A-Z]{2,4}$/) printf(arr[i])
}
我很快发现如果没有 --posix 开关,{n} 表达式将无法在 gawk 中工作。一旦启用,表达式就可以工作,但它是不区分大小写的匹配 AAAA 和 aaaa。这里发生了什么?
表达式本身对我有用:
dfs:~# gawk --posix '/^[A-Z]{2,4}$/ {print "Yes"}'
AAAA
Yes
AA
Yes
TT
Yes
tt
YY
Yes
yy
您的问题可能是由两件事引起的。要么您不小心设置了IGNORECASE
awk 变量,要么以其他方式关闭了不区分大小写的操作(BTWIGNORECASE
不适用于--posix
,但可以使用--re-interval
,这也启用了正则表达式中的大括号),或者这是语言环境整理序列的经典问题(因为 gawk 确实语言环境感知字符比较),这意味着小写字符在一些大写字符之间进行比较。从手册的相关部分引用:
许多语言环境按字典顺序对字符进行排序,在这些语言环境中,'[a-dx-z]' 通常不等同于 '[abcdxyz]';例如,它可能等同于“[aBbCcDdxXyYz]”。要获得括号表达式的传统解释,您可以通过将 LC_ALL 环境变量设置为值“C”来使用 C 语言环境。
我只安装了 mawk,但也许这就是你要找的?
for (i=1;i<=n;i++) { if (arr[i] ~ [^AZ]{2,4}$/) printf(arr[i]) }
否则,如果您使用GNU awk,则可以使用[:upper:]字母字符类。
% awk '{print /[:upper:]/?"OK":"KO"}'
AA
KO
aa
KO