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

时间:2013-08-07 20:56:58

标签: regex linux awk

请注意我在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

这是合法的吗?正在做什么?

4 个答案:

答案 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.htmlhttp://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