분음 부호를 무시하고 정규 표현식에서 ASCII 문자만 일치시킵니다.

분음 부호를 무시하고 정규 표현식에서 ASCII 문자만 일치시킵니다.

나는 다음과 같은 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

관련 정보