변수에 특수 제어 문자(예: 개행, 백스페이스 또는 캐리지 리턴 등) 없이 유효한 UTF-8 문자열이 포함되어 있는지 bash에서 확인하는 방법은 무엇입니까?
답변1
로케일이 문자 인코딩으로 UTF-8을 사용한다고 가정합니다(다음을 확인하세요 locale charmap
:
[[ $string =~ ^[^[:cntrl:]]*$ ]]
작동해야 합니다. 단, 적어도 GNU 시스템에서는 코드 포인트가 0x110000보다 높은 문자가 포함된 UTF-8 인코딩 문자열을 거부하지 못합니다.UTF-8 인코딩의 현재 정의에서는 더 이상 유효하지 않습니다.). 이는 bash
패턴 일치에 사용되는 시스템의 정규식 라이브러리에 따라 다릅니다 .
GNU도 마찬가지입니다 expr
:
expr " $string" : ' [^[:cntrl:]]*$' > /dev/null
zsh
여기에서 UTF-8 로케일의 위치 로 전환할 수 있습니다 .
set -o extendedglob
[[ $string = [' '-$'\ud7fff'$'\ue000'-$'\U10FFFF']# && $string != *[[:cntrl:]]* ]]
시스템에 관계없이 일관되게 작동해야 합니다(적어도 유효한 문자 일치의 경우 문자가 로 분류되는 시스템 간에 차이를 찾을 수 있음 [:cntrl:]
).
zsh glob 모드에서 멀티바이트 문자 로케일의 문자 범위는 UTF-8에서 항상 유니코드 코드 포인트인 문자의 와이드 문자 값을 기반으로 합니다. 유효한 문자의 일부를 형성하지 않는 바이트에는 문자가 아닌 0xD800..0xDFFF UTF16 서로게이트 쌍의 두 번째 부분에 있는 0xDC80..0xDCFF 범위의 wchar_t 값이 할당됩니다(임의의 바이트 시퀀스를 처리할 수 있는 유니코드 인식 일반 메서드).
Bash glob 패턴의 문자 범위 처리는 대부분 무작위입니다.이므로 여기서는 사용할 수 없습니다.
처리 방법을 고려할 수도 있습니다.비문자,개인용 캐릭터, 시스템이 사용하는 유니코드 버전에 현재 할당되지 않은 문자입니다. 개념제어유니코드의 경우 문자도 상당히 모호합니다. U+202E RIGHT-TO-LEFT OVERRIDE 문자, U+FEFF BOM 문자,상표수치예를 들어제어수치?