【问题标题】:AWK - My regexp won't respect caseAWK - 我的正则表达式不尊重大小写
【发布时间】:2010-10-08 18:48:27
【问题描述】:

我正在运行 Ubuntu 8.04,我的代码如下所示...

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

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

【问题讨论】:

  • 向我们展示整个 AWK 脚本或命令。我想我知道发生了什么事,但你没有提供足够的信息来确定。

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


【解决方案1】:

表达式本身对我有用:

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

您的问题可能是由两件事引起的。要么您不小心设置了IGNORECASE awk 变量,要么以其他方式关闭了case insensitive operation(顺便说一句,IGNORECASE 不适用于--posix,但适用于--re-interval,这也启用了正则表达式中的大括号),或者是 locale 的排序顺序的一个经典问题(因为 gawk 做了 locale-aware 字符比较),这意味着小写字符在一些大写字符之间进行比较。引用自relevant part of the manual:

许多语言环境对字符进行排序 字典顺序,并且在这些 语言环境,“[a-dx-z]”通常不是 相当于‘[abcdxyz]’;取而代之的是 可能相当于 例如,“[aBbCcDdxXyYz]”。到 获得传统解释 括号表达式,您可以使用 通过设置 LC_ALL 的 C 语言环境 环境变量的值“C”。

【讨论】:

  • 也许您应该指定 IGNORECASE 是一个环境变量,以便更清楚。
  • 是的,我可能应该有,因为它实际上不是环境变量。编辑澄清这一点。
【解决方案2】:

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

for (i=1;i

【讨论】:

  • 抱歉,我认为这不是 OP 要求的
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 2016-12-20
    相关资源
    最近更新 更多