Qual è il comando Bash che posso usare per convertire una stringa maiuscola in minuscola e viceversa?
Grazie.
Qual è il comando Bash che posso usare per convertire una stringa maiuscola in minuscola e viceversa?
Grazie.
Risposte:
Se la stringa è già memorizzata in una variabile, è possibile utilizzare bash
l'espansione dei parametri, in particolare ${parameter,,pattern}
(disponibile da bash 4.0), dove parameter
è il nome della variabile e pattern
viene omesso:
$ string="Hello, World!"
$ echo $string
Hello, World!
$ echo ${string,,}
hello, world!
Si noti che ciò non modifica il valore della variabile, ma solo l'output. Per modificare la variabile devi assegnare il nuovo valore:
$ echo $string
Hello, World!
$ string=${string,,}
$ echo $string
hello, world!
La conversione in maiuscolo funziona con ${parameter^^pattern}
:
$ echo ${string^^}
HELLO, WORLD!
Funziona anche con stringhe Unicode (almeno con le versioni bash attuali, probabilmente richiede almeno bash 4.3):
$ string='ἈΛΦΆβητος'
$ echo ${string,,}
ἀλφάβητος
$ echo ${string^^}
ἈΛΦΆΒΗΤΟΣ
Se si utilizza zsh
, è possibile utilizzare Flag di espansione parametri ( ${(FLAGS)NAME}
; disponibile da zsh 2.5) per ottenere gli stessi risultati. La bash
sintassi non funziona in zsh
1) . La bandiera per le lettere minuscole è L
; per maiuscole è U
:
$ string="Hello, World!"
$ echo ${(L)string}
hello, world!
$ echo ${(U)string}
HELLO, WORLD!
$ echo $string
Hello, World!"
Funziona anche con le stringhe Unicode (almeno da zsh 5.0; non ho provato con le versioni precedenti):
$ string='ἈΛΦΆβητος'
$ echo ${(L)string}
ἀλφάβητος
$ echo ${(U)string}
ἈΛΦΆΒΗΤΟΣ
1) Anche se, visto che zsh ha avuto questo per molto più tempo, probabilmente dovrebbe essere: "la zsh
sintassi non funzionabash
.
${string,,}
notazione esiste solo per bash versione 4+. Altrimenti è richiesta una delle altre soluzioni, come ad esempio $(echo $string | tr '[:upper:]' '[:lower:]')
.
Esistono pochissimi metodi che funzionano correttamente con Unicode:
GNU sed 4.2.2 funziona :
$ echo "Idą gęsi łąką" | sed 's/.*/\U&/'
IDĄ GĘSI ŁĄKĄ
bash 4.2.45 dichiarare non funziona:
$ typeset -u ucase; ucase="Idą gęsi łąką"; echo $ucase
IDą GęSI łąKą
bash 4.2.45 l'espansione dei parametri non funziona:
$ str="Idą gęsi łąką"; echo ${str^^}
IDą GęSI łąKą
bash 4.3.42 declare
e lavoro di espansione dei parametri :
$ declare -u ucase
$ ucase="Idą gęsi łąką"
$ echo $ucase
IDĄ GĘSI ŁĄKĄ
$ echo ${ucase,,}
idą gęsi łąką
GNU tr 8.20 non funziona:
$ echo "Idą gęsi łąką" | tr '[:lower:]' '[:upper:]'
IDą GęSI łąKą
mawk (awk predefinito in Ubuntu 13.10) non funziona:
$ echo "Idą gęsi łąką" | mawk '{print toupper($0)}'
IDą GęSI łąKą
gawk funziona :
$ echo "Idą gęsi łąką" | gawk '{print toupper($0)}'
IDĄ GĘSI ŁĄKĄ
Perl pure uc () non funziona:
$ echo "Idą gęsi łąką" | perl -ne 'print uc($_);'
IDą GęSI łąKą
Python 2 senza alcun suggerimento Unicode non funziona:
$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().upper(),'
IDą GęSI łąKą
Python 2 quando viene incaricato di gestire Unicode funziona :
$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().decode("utf-8").upper(),'
IDĄ GĘSI ŁĄKĄ
Python 3 funziona :
$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
IDĄ GĘSI ŁĄKĄ
gawk
come awk predefinito (come mostrato con update-alternatives --display awk
). Sei sicuro che mawk
sia l'impostazione predefinita in 13.10?
sed
s dal 1990 hanno supportato l' \U
opzione ;-). Non è una caratteristica specifica di gnu-sed. Altrimenti, ottima risposta, tante opzioni, così poco tempo ;-) Buona fortuna a tutti!
uc
non funziona in Perl perché devi use Encode
o use utf8
. Riscrivi il tuo esempio come echo "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))'
e funzionerà. Vedere anche stackoverflow.com/a/13261662/3701431
Userei interno bash comporre o dichiarare comando per definire una variabile minuscola.
$ typeset -l lcase
$ lcase="LoWeR cAsE"
$ echo $lcase
lower case
I caratteri vengono abbassati quando viene impostato il valore, non quando si digita la variabile. Quindi è meglio comporre all'inizio dello script. Per le maiuscole è possibile digitare -u .
$ typeset -u ucase
$ ucase="Upper cAsE"
$ echo $ucase
UPPER CASE
Questo non è specifico della shell bash, che funziona anche su ksh, forse è nella definizione della shell POSIX.
EDIT: Molte persone mi hanno gentilmente sottolineato il fatto che il set è ora considerato obsoleto su bash e sostituito da dichiarare . Entrambi i comandi sono equivalenti.
$ 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.
Io stesso uso ancora la sintassi del set mentre lavoro in un ambiente eterogeneo, quindi non devo riscrivere i miei script.
typeset
è considerato depricated e sostituirlo condeclare
Puoi farlo con il tr
comando.
Nel terminale ( Ctrl+ Alt+ T)
Questo comando:
echo 'String here' | tr "[:lower:]" "[:upper:]"
convertirà le lettere minuscole in maiuscole.
echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"
convertirà maiuscole in minuscole.
Esempio:
Il merito va alla cybercity
tr A-Z a-z
funzionerà anche.
Non è una soluzione bash pura, ma puoi reindirizzare le tue corde perl
(come ha fatto Olised
):
$ echo lowercase | perl -ne 'print "\U$_"'
LOWERCASE
E \L
avrà l'effetto opposto:
$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase
Utilizzare questo semplice comando Per maiuscole e minuscole Dove 'f' è il nome del file in cui si desidera eseguire la conversione.
tr "A-Z" "a-z" < f
Per maiuscole e minuscole
tr "a-z" "A-Z" < f