请注意我在AWK中需要这个答案。
如何从某些awk变量中删除所有小写字符?我试着打电话给gsub:
gsub(/[a-z]+/,"",varName);
不幸的是,这会删除整个字符串,就好像awk无法区分大小写的区别。我可以使用一些我不知道的正则表达式吗?
编辑:确认,awk没有看到小写和大写字符之间的区别。
示例1(这里将使用字母f来更好地理解结果):
varName="CHRFProtocol";
gsub(/[a-z]/,"f",varName);
结果:ffffffffffff
示例2(同样,这里将使用字母f来更好地理解结果):
varName="CHRFProtocol";
gsub(/[A-Z]/,"f",varName);
结果:ffffffffffff
这是合法的吗?正在做什么?
答案 0 :(得分:5)
您的区域设置正在妨碍您。试试这个:
LC_ALL=C awk 'BEGIN {
varName="CHRFProtocol";
gsub(/[a-z]/,"f",varName);
print(varName); }'
GNU awk尊重语言环境设置,在Linux上的大多数国家语言环境中,正则表达式不区分大小写。在C
命令的持续时间内将语言环境重置为POSIX
(= awk
)可恢复区分大小写。
答案 1 :(得分:3)
你应该只使用POSIX字符类[[:lower:]],而不是[a-z]:
gsub(/[[:lower:]]/,"",varName)
后者依赖于语言环境,前者不是。
似乎对何时使用POSIX字符类与何时/如何设置语言环境存在一些混淆:
1)当你感兴趣的字符集存在时,总是使用POSIX字符类(例如[:digit:],[:lower:],[:punct:]等等)。
2)否则,设置LC_ALL = C如果您对其他设置有何影响(例如逗号与句号作为千位分隔符)
3)否则,设置LC_COLLATE = C.
有关字符类和区域设置变量的详细信息,请参阅http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html和http://pubs.opengroup.org/onlinepubs/009695399/utilities/awk.html。
答案 2 :(得分:1)
要删除awk中的所有小写字符,请使用:
gsub(/[a-z]+/, "", varName);
您实际上用文字字符串"f"
替换了一个或多个小写字母的字母
编辑在您更正问题之后:
请注意,如果您的varName
只包含小写字母或已经为空,那么您将在varName
中获得一个空字符串。
答案 3 :(得分:1)
示例解释了一切:
kent$ awk 'BEGIN{var="AaBbCcDDDdddEEEeee";print "before:"var;gsub(/[a-z]/,"",var);print "after:"var}'
before:AaBbCcDDDdddEEEeee
after:ABCDDDEEE