Por que o sed não segue a ordem de intercalação?

2

Neste comando:

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

Parece correto, não é?
No entanto, a localidade em vigor é en_US.utf8 . A ordem de intercalação para essa localidade é (usando o bash ):

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

Ou, se o seu sort não puder usar -z:

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

Se isso estiver correto, o intervalo [b-y] deve corresponder a todos os caracteres acima, exceto aAYzZ .
Mas isso não acontece.

O Grep faz o mesmo em [a-z] . Corresponde a todos os caracteres minúsculos (até acentuados):

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

E com [a-Z] corresponde a todos os caracteres (esse intervalo deve ser inválido):

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

1 resposta

0

O que eu entendo da sua pergunta é que você gostaria de usar um conjunto de caracteres.

Usando sed:

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

Usando o grep:

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