如何使用AWK从string中删除所有小写字符?

请注意,我需要在AWK这个答案。

如何从一些awkvariables中删除所有小写字符? 我试着调用gsub:

gsub(/[az]+/,"",varName);

不幸的是,这将删除整个string,就好像awk无法区分大写和小写之间的区别。 有没有一些正则expression式,我可以使用,我不知道?

编辑:确认,awk没有看到小写字母和大写字母之间的区别。

例1(在这里用字母f来更好地理解结果):

 varName="CHRFProtocol"; gsub(/[az]/,"f",varName); 

结果: ffffffffffff

例2(再次,这里将使用字母f来更好地理解结果):

 varName="CHRFProtocol"; gsub(/[AZ]/,"f",varName); 

结果: ffffffffffff

这是合法的吗? 干什么?

您的语言环境设置正在受到阻碍。 尝试这个:

 LC_ALL=C awk 'BEGIN { varName="CHRFProtocol"; gsub(/[az]/,"f",varName); print(varName); }' 

GNU awk honors语言环境设置,在Linux上大多数国家/地区,正则表达式不区分大小写。 在awk命令的持续时间内将区域设置重置为C (= POSIX )将恢复区分大小写。

您应该只使用POSIX字符类[[:lower:]],而不是[az]:

 gsub(/[[:lower:]]/,"",varName) 

后者是语言环境依赖的,前者不是。

似乎有什么困惑什么时候使用POSIX字符类与何时/如何设置语言环境如此:

1)当你感兴趣的字符集(例如[:digit:],[:lower:],[:punct:]等等)存在时,总是使用POSIX字符类。

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

要删除awk中的所有小写字符,请使用:

 gsub(/[az]+/, "", varName); 

你实际上用字符串"f"代替了一个或多个出现的小写字母,

编辑你纠正你的问题后:

请注意,如果您的varName只包含小写字母或已经是空的,那么您将在varName获得一个空字符串。

例子解释了一切:

 kent$ awk 'BEGIN{var="AaBbCcDDDdddEEEeee";print "before:"var;gsub(/[az]/,"",var);print "after:"var}' before:AaBbCcDDDdddEEEeee after:ABCDDDEEE