![sed가 대조 순서를 따를 수 없는 이유는 무엇입니까?](https://linux55.com/image/133478/sed%EA%B0%80%20%EB%8C%80%EC%A1%B0%20%EC%88%9C%EC%84%9C%EB%A5%BC%20%EB%94%B0%EB%A5%BC%20%EC%88%98%20%EC%97%86%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
이 명령에서:
$ 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