AWK不使用正则表达式[0-z]范围捕获Z.

时间:2014-01-24 12:55:37

标签: regex awk

在awk中使用gensub我注意到我的资本Z没有使用以下awk行重新识别:

awk '{name=gensub(/[0-z]/,"succes","g",$0); print name}' range2.txt

在文件“range2.txt”上有以下文字:

A
B
Z

在Z上它只返回Z而不是“succes”。如果不匹配,它将返回目标。但为什么它无与伦比?当我把我的问题和其他问题混在一起时,这让我继续进行循环。我有一个解决方案来完成工作,但我仍然很好奇为什么。我尝试了alfabet的所有其他字母和数字,这些字母都返回成功除了大写字母Z.然而,这封信或多或少处于范围的中间。

Locale charmap返回ISO-8859-15,其中Z在0-z范围的中间。

我把这个问题归结为我刚刚写下的内容,但没有看到更多的空缺。我也使用过其他AWK字符串函数,它们都没有找到Z.即SPLIT MATCH GSUB。

我确实尝试手动添加Z然后它可以工作:

  

awk'{name = gensub(/ [0-zZ] /,“succes”,“g”,$ 0); print name}'range2.txt

但仍然......

2 个答案:

答案 0 :(得分:1)

唯一可能的答案是Z不在语言环境的指定范围内。您的区域设置可能会在您的发行版中被破坏。尝试使用相同范围的其他工具(如grep和sed)来查看是否可以重现问题 - 如果是这样,问题出在你的语言环境中,如果不是你的问题。

答案 1 :(得分:0)

在所有输入之后我现在可以自己回答这个问题了。

LC_all = C IS实际上正在工作,但它必须作为环境变量导出。所以我应该在我的控制台中发出export LC_ALL=C(或者更具体地说是LC_COLLATE),而不仅仅是LC_ALL=C。可以使用后者,但只能使用必须独立于语言环境的命令。

从版本4开始,awk应该是独立于区域设置的,但我的版本仍然是版本3.所以对我来说,我仍然需要发布awk:

LC_ALL=C awk '{name=gensub(/[0-z]/,"succes","g",$0); print name}' range2.txt

LC_COLLATE=C awk '{name=gensub(/[0-z]/,"succes","g",$0); print name}' range2.txt

我的grep使用不同的语言环境。我找不到这些区域设置的位置,这很有趣,但我确实看到了关于字符范围的不同行为。 grep也可以从独立于区域设置中受益。所以在我的设置中:

echo Z | grep [0-z]

什么都不返回,以下返回Z

LC_ALL echo Z | grep [0-z]