나는 다음과 같은 bash 스크립트에서 정규식을 사용하고 있습니다.
REGEX="^[a-zA-Z0-9\-]+$"
모든 비표준 단어, 특히 독일어 특수 문자가 포함된 단어를 필터링하고 싶습니다.äöüÄÖÜß
그러나 따르면이 설명서LOCALE을 독일어로 설정하면 정규 표현식에는 a-z
다음도 포함됩니다.ö
이 문제를 어떻게 해결할 수 있나요?
스크립트 시작 부분에서 로케일을 영어로 설정해 보았습니다.
#!/bin/bash
LANG=en_US.utf8
LANGUAGE=en_US.utf8
LC_ALL=en_US.utf8
export LANG
export LANGUAGE
export LC_ALL
그러나 아무 소용이 없습니다.
이 해결 방법을 수행하고 미리 특수 문자를 바꾸고 싶지 않습니다.
tr _ -|tr . -|tr " " -|tr '[:upper:]' '[:lower:]'|sed 's/ä/ae/;s/ö/oe/;s/ü/ue/;s/ß/ss/g')
차라리 올바른 방법을 배우고 싶습니다.
답변1
사용:
REGEXP='^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0-9-]+$'
원하는 캐릭터를 선택하세요. 일치하는 콘텐츠는 C/POSIX 로케일 [a-z]
에만 보장됩니다 .[abcdefghijkmnopqrstuvwxyz]
(백슬래시를 포함하고 싶지 않다고 가정하지만 이는 \
이스케이프에 대한 나쁜 시도입니다 -
.)
^[a-zA-Z0-9-]+$
또 다른 옵션은 확장 정규식(또는 )을 평가하는 도구를 사용하기 전에 로케일을 C로 수정하는 것입니다 ^[[:alnum:]-]+$
. 예를 들면 다음과 같습니다.
LC_ALL=C grep -Ee "$REGEXP"
REGEXP='[A-Z]'
이 경우에는 작동하지만 정규식과 일치하는 데이터가 BIG5-HKSCS 또는 GB18030과 같은 문자 세트(및 동일한 문자를 사용하는 로케일)에 있는 경우에는 작동하지 않습니다 . 인코딩은 A-Z
.
[A-Z]
일치 예 Á
(U+00C1, BIG5-HKSCS에서 0x88 0x57로 인코딩됨(0x57도 W
)):
$ LC_ALL=zh_HK.big5hkscs REGEXP='[A-Z]' bash -c 'printf "\uc1\n" |
LC_ALL=C grep -qe "$REGEXP" && echo match'
match