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

関連情報