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 bashl'espansione dei parametri, in particolare ${parameter,,pattern}(disponibile da bash 4.0), dove parameterè il nome della variabile e patternviene 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 bashsintassi 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 zshsintassi 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 declaree 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Ą
gawkcome awk predefinito (come mostrato con update-alternatives --display awk). Sei sicuro che mawksia l'impostazione predefinita in 13.10?
seds dal 1990 hanno supportato l' \Uopzione ;-). Non è una caratteristica specifica di gnu-sed. Altrimenti, ottima risposta, tante opzioni, così poco tempo ;-) Buona fortuna a tutti!
ucnon funziona in Perl perché devi use Encodeo 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 trcomando.
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-zfunzionerà 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 \Lavrà 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