Conflito entre substituição de variáveis e caracteres CJK no BASH

6

Eu encontrei um problema com a substituição de variáveis no shell BASH.
Digamos que você defina uma variável a . Então o comando

    $> echo ${a//[0-4]/}

imprime seu valor com todos os números entre 0 e 4 removidos:

    $> a="Hello1265-3World"
    $> echo ${a//[0-4]/}
    Hello65-World

Isso parece funcionar bem, mas vamos dar uma olhada no próximo exemplo:

    $> b="你1265-3好"
    $> echo ${b//[0-4]/}
    你1265-3好

A substituição não ocorreu: presumo que seja porque b contém caracteres CJK. Esse problema se estende a todos os casos em que os colchetes estão envolvidos. Surpreendentemente, a substituição de variáveis sem colchetes funciona bem em ambos os casos:

    $> a="Hello1265-3World"
    $> echo ${a//2/}
    Hello165-3World
    $> b="你1265-3好"
    $> echo ${b//2/}
    你165-3好

É um bug ou estou faltando alguma coisa?

Eu uso o Lubuntu 12.04, o terminal é lxterminal e echo $BASH_VERSION retorna 4.2.24 (1) -release.

EDIT: Andrew Johnson em seu comentário afirmou que com gnome-terminal 4.2 .37 (1) -release o comando funciona bem. Gostaria de saber se é um problema de lxterminal ou de sua versão específica da versão 4.2.24 (1).

EDIT: Eu tentei com gnome-terminal no Lubuntu 12.04 mas o problema ainda está lá ...

    
por AndreasT 13.12.2012 / 14:58

1 resposta

2

Resposta curta:

defina LC_ALL = C como o comportamento esperado

pauhel@permafrost:~$ b="你1265-3好"
paul@permafrost:~$ echo ${b//[0-2]/}
你1265-3好
paul@permafrost:~$ export LC_ALL=C
paul@permafrost:~$ echo ${b//[0-2]/}
你65-3好

Resposta longa:

O comportamento esperado depende da ordenação de intercalação, que é dependente da implementação do código do idioma / SO. O padrão POSIX deixa especificamente indefinido, exceto para o local C. (Bash chama uma biblioteca externa para isso e, a um palpite, parece que isso volta para a ordenação ASCII se apenas caracteres ASCII estiverem presentes).

Versões posteriores do bash têm uma opção de shell que permite especificar algo como você espera.

Veja:

link

para mais informações.

    
por tallus 30.01.2013 / 09:00