AWK игнорирует регистр в классах символов - PullRequest
2 голосов
/ 06 апреля 2011

Я хотел бы написать условное выражение 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

1 Ответ

2 голосов
/ 06 апреля 2011

Что я неправильно понимаю?В частности, почему [AC] нечувствителен к регистру

Это, вероятно, связано с вашей локалью, которая может повлиять на диапазоны классов символов.

Попробуйте установить export LC_ALL=C и запустить awk.введите команду снова с [A-C]

почему мне нужно писать [[: upper:]] вместо [: upper:]?

[:upper:] в основномнечувствительный к локали способ записи диапазона A-Z, но вы также хотите, чтобы это был класс символов, поэтому вы заключаете его в [], следовательно, [[:upper:]].Так, например, если вы хотите сопоставить все заглавные буквы и цифры, вы должны написать [[:upper:][:digit:]]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...