Qual é o comando Bash que posso usar para converter uma seqüência de letras maiúsculas em minúsculas e vice-versa?
Obrigado.
Qual é o comando Bash que posso usar para converter uma seqüência de letras maiúsculas em minúsculas e vice-versa?
Obrigado.
Respostas:
Se a string já estiver armazenada em uma variável, você poderá usar bash
a expansão de parâmetro, especifialmente ${parameter,,pattern}
(disponível desde o bash 4.0), onde parameter
é o nome da sua variável e pattern
é omitido:
$ string="Hello, World!"
$ echo $string
Hello, World!
$ echo ${string,,}
hello, world!
Observe que isso não altera o valor da variável, apenas a saída. Para alterar a variável, você deve atribuir o novo valor:
$ echo $string
Hello, World!
$ string=${string,,}
$ echo $string
hello, world!
A conversão em maiúsculas funciona com ${parameter^^pattern}
:
$ echo ${string^^}
HELLO, WORLD!
Isso funciona também com cadeias de caracteres Unicode (pelo menos nas versões atuais do bash, provavelmente precisa de pelo menos o 4.3):
$ string='ἈΛΦΆβητος'
$ echo ${string,,}
ἀλφάβητος
$ echo ${string^^}
ἈΛΦΆΒΗΤΟΣ
Se você estiver usando zsh
, poderá usar Sinalizadores de Expansão de Parâmetro ( ${(FLAGS)NAME}
; disponível desde o zsh 2.5) para obter os mesmos resultados. A bash
sintaxe não funciona em zsh
1) . A bandeira para minúsculas é L
; para maiúsculas é U
:
$ string="Hello, World!"
$ echo ${(L)string}
hello, world!
$ echo ${(U)string}
HELLO, WORLD!
$ echo $string
Hello, World!"
Isso também funciona com cadeias de caracteres Unicode (pelo menos desde o zsh 5.0; não tentei com versões anteriores):
$ string='ἈΛΦΆβητος'
$ echo ${(L)string}
ἀλφάβητος
$ echo ${(U)string}
ἈΛΦΆΒΗΤΟΣ
1) Embora, considerando que o zsh tenha isso por muito mais tempo, provavelmente deva ser: "a zsh
sintaxe não funcionabash
.
${string,,}
notação existe apenas para o bash versão 4+. Caso contrário, é necessária uma das outras soluções, como $(echo $string | tr '[:upper:]' '[:lower:]')
.
Existem muito poucos métodos que funcionam corretamente com Unicode:
O GNU sed 4.2.2 funciona :
$ echo "Idą gęsi łąką" | sed 's/.*/\U&/'
IDĄ GĘSI ŁĄKĄ
bash 4.2.45 declare não funciona:
$ typeset -u ucase; ucase="Idą gęsi łąką"; echo $ucase
IDą GęSI łąKą
A expansão do parâmetro bash 4.2.45 não funciona:
$ str="Idą gęsi łąką"; echo ${str^^}
IDą GęSI łąKą
bash 4.3.42 declare
e trabalho de expansão de parâmetros :
$ declare -u ucase
$ ucase="Idą gęsi łąką"
$ echo $ucase
IDĄ GĘSI ŁĄKĄ
$ echo ${ucase,,}
idą gęsi łąką
O GNU tr 8.20 não funciona:
$ echo "Idą gęsi łąką" | tr '[:lower:]' '[:upper:]'
IDą GęSI łąKą
O mawk (padrão do awk no Ubuntu 13.10) não funciona:
$ echo "Idą gęsi łąką" | mawk '{print toupper($0)}'
IDą GęSI łąKą
gawk works :
$ echo "Idą gęsi łąką" | gawk '{print toupper($0)}'
IDĄ GĘSI ŁĄKĄ
O Perl pure uc () não funciona:
$ echo "Idą gęsi łąką" | perl -ne 'print uc($_);'
IDą GęSI łąKą
O Python 2 sem nenhuma dica Unicode não funciona:
$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().upper(),'
IDą GęSI łąKą
Python 2, quando instruído a lidar com obras Unicode :
$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().decode("utf-8").upper(),'
IDĄ GĘSI ŁĄKĄ
O Python 3 funciona :
$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
IDĄ GĘSI ŁĄKĄ
gawk
como o awk padrão (como mostrado em update-alternatives --display awk
). Tem certeza de que mawk
é o padrão na 13.10?
sed
s desde 1990 apoiaram a \U
opção ;-). Não é um recurso específico do gnu-sed. Caso contrário, ótima resposta, tantas opções, tão pouco tempo ;-) Boa sorte a todos!
uc
não funciona no Perl porque você precisa use Encode
ou use utf8
. Reescreva seu exemplo como echo "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))'
e ele funcionará. Veja também stackoverflow.com/a/13261662/3701431
Eu usaria o comando bash typeset interno ou declare para definir uma variável em minúscula.
$ typeset -l lcase
$ lcase="LoWeR cAsE"
$ echo $lcase
lower case
Os caracteres são reduzidos quando o valor é definido, não quando você digita a variável. Portanto, é melhor digitar no início do script. Para maiúsculas, você pode digitar -u .
$ typeset -u ucase
$ ucase="Upper cAsE"
$ echo $ucase
UPPER CASE
Isso não é específico para o bash shell, que também funciona no ksh, talvez na definição de shell do POSIX.
EDIT: Muitas pessoas gentilmente me apontaram o fato de que o typeset agora é considerado obsoleto no bash e substituído por declare . Ambos os comandos são equivalentes.
$ help typeset
typeset: typeset [-aAfFgilrtux] [-p] name[=value] ...
Set variable values and attributes.
Obsolete. See `help declare'.
$ help declare
declare: declare [-aAfFgilrtux] [-p] [name[=value] ...]
Set variable values and attributes.
Eu mesmo ainda uso a sintaxe tipográfica enquanto trabalho em ambiente heterogêneo, portanto, não preciso reescrever meus scripts.
typeset
é considerado desprovido e substituído pordeclare
Você pode fazer isso com o tr
comando
No terminal ( Ctrl+ Alt+ T)
Este comando:
echo 'String here' | tr "[:lower:]" "[:upper:]"
irá converter em minúsculas para maiúsculas.
echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"
irá converter maiúsculas em minúsculas.
Exemplo:
O crédito vai para a cibercidade
tr A-Z a-z
também funcionará.
Não é uma solução pura para o bash, mas você pode passar as cordas perl
(como Oli fez com sed
):
$ echo lowercase | perl -ne 'print "\U$_"'
LOWERCASE
E \L
terá o efeito oposto:
$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase
Use este comando simples Para maiúsculas e minúsculas Onde 'f' é o nome do arquivo em que você deseja fazer a conversão.
tr "A-Z" "a-z" < f
Para maiúsculas e minúsculas
tr "a-z" "A-Z" < f