awk 정규식의 일련의 소문자에 대문자가 포함되는 이유는 무엇입니까?

awk 정규식의 일련의 소문자에 대문자가 포함되는 이유는 무엇입니까?
$ echo ABC | awk '$0 ~ /^[a-b]/'
ABC
$ echo ABC | awk '$0 ~ /^[a-a]/'
$ echo ABC | awk '$0 ~ /^a/'
$ 

바라보다. /[a-b]/캡처 A하지만 캡처하지 않을 /[a-a]/수도 있습니다 /a/. 왜?

답변1

나는 이것이 "로케일" 문제라고 생각합니다.

내 로케일 it_IT에서 다음 코드 조각

if [[ a < A ]]; then
  echo "a < A"
elif [[ a > A ]]; then
  echo "a > A"
else
  echo "a = A"
fi

if [[ b < A ]]; then
  echo "b < A"
elif [[ b > A ]]; then
  echo "b > A"
else
  echo "b = A"
fi

프로그램

a < A
b > A

A그래서 (놀랍게도) a와 사이에 있으므로 b범위 내에 있습니다.

실행을 시도하다

echo ABC | LC_COLLATE=C awk '$0 ~ /^[a-b]/'

편집하다

다음 명령은 해당 로케일의 조합 순서를 표시합니다.

echo $(LC_COLLATE=C printf '%s\n' {A..z} | sort)

내 컴퓨터의 출력은 다음과 같습니다.

` ^ _ [ ] a A b B c C d D e E f F g G h H i I j J k K l L m M n N o O p P q Q r R s S t T u U v V w W x X y Y z Z

(bash의 매뉴얼 페이지에서 이해할 수 없습니다서열 표현로캘 조합 순서로 확장할지 여부는 그렇지 않은 것 같습니다.

관련 정보