在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
但仍然......
答案 0 :(得分:1)
唯一可能的答案是Z不在语言环境的指定范围内。您的区域设置可能会在您的发行版中被破坏。尝试使用相同范围的其他工具(如grep和sed)来查看是否可以重现问题 - 如果是这样,问题出在你的语言环境中,如果不是你的问题。
答案 1 :(得分:0)
在所有输入之后我现在可以自己回答这个问题了。
LC_all = C IS实际上正在工作,但它必须作为环境变量导出。所以我应该在我的控制台中发出export LC_ALL=C
(或者更具体地说是LC_COLLATE),而不仅仅是LC_ALL=C
。可以使用后者,但只能使用必须独立于语言环境的命令。
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]