Existe uma maneira portátil de alternar maiúsculas e minúsculas na linha de comando?

3

Existe uma maneira, portátil entre sistemas operacionais POSIX e reconhecimento de local, para alternar caso de texto a partir da linha de comando - que está substituindo letras minúsculas por letras maiúsculas e vice-versa. / p>

Usando o GNU sed, eu posso usar isso:

echo 'Yes, I Know IT!' | sed -E 's/([[:upper:]]*)([[:lower:]]*)/\L\U/g'
yES, i kNOW it!

Que funciona bem com letras acentuadas:

echo Élève | sed -E 's/([[:upper:]]*)([[:lower:]]*)/\L\U/g'
éLÈVE

Mas como ele usa a extensão \L e \U GNU não é portátil. E tr , por outro lado, não lida corretamente com letras acentuadas na minha caixa de Linux:

echo 'Élève' | tr '[:lower:][:upper:]' '[:upper:][:lower:]'
ÉLèVE

Alguma solução?

    
por Sylvain Leroux 18.09.2018 / 00:03

1 resposta

3

Se você aceitar perl , essa solução será copiada diretamente de Perl, usando a função tr para converter maiúsculas para minúsculas e vice-versa -versa ao mesmo tempo? funcionará para você:

echo 'Hello Élève. It is beautiful!' |
    perl -Mopen=locale -Mutf8 -pe 's/([[:upper:]])|([[:lower:]])/defined $1 ? lc $1 : uc $2/eg'

hELLO éLÈVE. iT IS BEAUTIFUL!

Eu também queria saber como usar algo como ( gsed ... || tr ... ) para que sistemas com gsed do GNU tivessem prioridade, mas em outros sistemas onde tr era provavelmente não o GNU que seria executado em vez disso . (% GNU POSIX tr aparentemente lida com caracteres multi-byte corretamente.)

    
por 18.09.2018 / 00:55