sed가 대조 순서를 따를 수 없는 이유는 무엇입니까?

sed가 대조 순서를 따를 수 없는 이유는 무엇입니까?

이 명령에서:

$ echo "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" |
>      sed 's/[a-z]//g'
ABCDEFGHIJKLMNOPQRSTUVWXYZ

맞는 것 같죠?
그러나 유효한 로케일은 입니다 en_US.utf8. 이것해당 로케일의 조합 순서예(bash 사용):

$ printf '%b' "$(printf '\\U%x\\0' {65..90} {97..122})" | sort -z; echo
aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ

또는 sort-z를 사용할 수 없는 경우:

$ printf '%s' $(printf '%s\n' {a..z} {A..Z} | sort); echo
aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ

이것이 맞다면 범위는 [b-y]위를 제외한 모든 문자와 일치해야 합니다 aAYzZ.
그러나 그것은 진실이 아니다.


Grep은 에서도 동일한 작업을 수행합니다 [a-z]. 모든 소문자(악센트 포함)와 일치합니다.

$ printf '%s' $(printf '%s' {a..z} {A..Z} éáíèüÉÁÍÈÜ | grep -o '[a-z]'); echo
abcdefghijklmnopqrstuvwxyzéáíèü

이를 사용하여 [a-Z]모든 문자를 일치시킵니다(해당 범위는 효과가 없습니다).

$ printf '%s' $(printf '%s' {a..z} {A..Z} éáíèüÉÁÍÈÜ | grep -o '[a-Z]'); echo
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZéáíèüÉÁÍÈÜ

답변1

귀하의 질문에서 일련의 문자를 grep하거나 sed하고 싶다는 것을 이해합니다.

사용sed:

$ printf '%s' $(printf '%s\n' {a..z} {A..Z} | sort) | sed 's/b[^|]*y//g'
aAYzZ

사용그렙:

$ printf '%s' $(printf '%s' {a..z} {A..Z} éáíèüÉÁÍÈÜ | grep -o "a[^|]*z"); echo
abcdefghijklmnopqrstuvwxyz

관련 정보