존재하다이 문제한 댓글은 이렇게 말했습니다.
이 모든 것은 "POSIX 로케일에서"가 무엇을 의미하는지 이해하지 못하는 데서 비롯됩니다. (-: 그리스어 소문자를 (예:) sed 및 [[:lower:]] 및 편리한 el_GR.UTF-8 로케일과 일치시키도록 노력해야 합니다. – JdeBP
그렇다면 "POSIX 로케일에서"는 무엇을 의미합니까?
보너스: C가 아닌 다른 로케일의 POSIX에서도 작동하나요?
LC_ALL=C grep '[[:lower:]]' file
답변1
POSIX가 ("on")이라고 말할 때
POSIX 로케일에서는 다음만 가능합니다.
ABCDEFGHIJKLMNOPQRSTU VWXYZ
다음을 포함해야 합니다:
POSIX 로케일을 정의합니다. 즉, POSIX 로케일의 컨텍스트에서 "상위" 문자 클래스에는 나열된 문자만 포함됩니다.
POSIX는 다른 로케일을 정의하지 않지만 시스템에서는 자유롭게 정의할 수 있습니다. 따라서 grep '[[:lower:]]' file
POSIX로만 제한하면 POSIX 이외의 로케일에서 유용한 작업을 수행할 수 없습니다. 그러나 많은 시스템에서는 다른 로캘과 해당 문자 클래스를 정의합니다. 예를 들어, GNU C 라이브러리 로케일을 사용하는 시스템에서는
$ echo 'α' | LC_ALL=el_GR.UTF-8 grep '[[:lower:]]'
α
(이것은 el_GR.UTF-8
로캘을 사용할 수 있다고 가정합니다. Debian 파생 버전에서는 이를 확인하는 빠른 방법은 패키지를 설치하는 것입니다 locales-all
.)
답변2
귀하의 제안(다른 질문)을 완전히 이해하지 못합니다. 그런데 사용 사례를 잘못 이해하신 것 같습니다.POSIX 로케일.
귀하의 제안은 로케일이 그리 좋지 않은 것 같습니다.사용자친숙한. 그리고 이를 달성하려면 적응해야 합니다. 하지만사용자친절하다는 것은 posix local의 요점이 아닙니다. 그것은 다른 규칙을 가진 다른 로케일의 임무입니다.
posix 로컬은 예상대로 작동합니다. 실제로 단순함의 이점도 있습니다. 다른 언어를 표준에 통합하기 시작하면 중단하기 어렵고, 결과적으로 유지 관리가 많이 필요하고 구현하기 어려운 표준이 됩니다.
개발자로서 모든 언어에 대한 모든 규칙을 알고, 규칙을 "알파벳순"으로 정렬하는 방법을 알고, 실제로 어떤 것이 대문자인지 소문자인지 아는 것은 불가능합니다. 영어가 아닌 언어에 대한 규칙은 정말 복잡합니다. 따라서 다른 모든 언어에 대한 규칙을 포함하도록 Posix 로컬을 조정하면 실제로 그 동작을 예측할 수 없게 됩니다.
posix 로케일을 변경하면 실제로 이전 시스템의 동작이 새 시스템의 동작과 일치하지 않는 소프트웨어가 손상될 수 있습니다. (아래 일화 참조)
일화
내가 본 버그 중 가장 모호하고 진단하기 어려운 버그 중 하나는 다음과 같습니다.ETL 도구행을 "무작위로" 삭제합니다. 힘든 분석 끝에 소프트웨어가 제대로 작동하지만 LC_COLLATE=C로 실행하는 경우에만 작동한다는 사실이 발견되었습니다. 이는 레코드를 일치시킬 때 자체 내부 정렬 순서와 일치하는 데이터베이스의 정렬 순서에 의존하기 때문입니다. 개발자들은 일부 로케일에서 숫자가 "-1, -2, 1, 2" 대신 "0, -1, 1, -2, 2" 알파벳순으로 텍스트를 정렬한다는 사실을 인식하지 못했습니다.
사용자 상호 작용 외에도 이는 시스템이 모든 시스템에 공통적으로 적용되는 예측 가능한 방식으로 작동해야 함을 보여줍니다.