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