我想写一个awk条件,匹配一个字符串,如果它以大写字母开头。这是一个示例数据文件。
a
b
c
A
B
C
d
e
假设我想匹配匹配字符ABC的所有行。
awk '{ if ($1 ~ /^[ABC]/) print }' test
A
B
C
够容易。但是如果我使用字符类,这不起作用。案例被忽略。
awk '{ if ($1 ~ /^[A-C]/) print }' test
b
c
A
B
C
有趣的是,这有效:
awk '{ if ($0 ~ /^[[:upper:]]/) print }' < test
A
B
C
从文档中,我希望命令是:
awk '{ if ($0 ~ /^[:upper:]/) print }' < test
我误解了什么?具体来说,为什么[A-C]
不区分大小写,为什么我需要写[[:upper:]]
而不是[:upper:]
?
echo $LANG
en_US.utf8
答案 0 :(得分:2)
我误解了什么? 具体来说,为什么是[A-C]案例 不敏感的
这可能与您的语言环境有关,这可能会影响字符类范围。
尝试设置export LC_ALL=C
然后再次使用awk
[A-C]
命令
为什么我需要写[[:upper:]] 而不是[:upper:]?
[:upper:]
基本上是编写范围 A-Z
的区域设置不敏感的方式,但您也希望它是一个字符类,因此您将其包装在{{1}中因此[]
。因此,例如,如果您想匹配所有大写字母和数字,您可以编写[[:upper:]]