Comando per convertire una stringa maiuscola in minuscola?


Risposte:


59

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 .


3
La ${string,,}notazione esiste solo per bash versione 4+. Altrimenti è richiesta una delle altre soluzioni, come ad esempio $(echo $string | tr '[:upper:]' '[:lower:]').
Quinn Comendant,

40

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Ą

1
Su Ubuntu 13.04, ho gawkcome awk predefinito (come mostrato con update-alternatives --display awk). Sei sicuro che mawksia l'impostazione predefinita in 13.10?
Kiri,

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!
shellter

Inoltre ci saranno alcuni problemi con turca (tratteggiate e errati privi di punti i), per più un'occhiata ai seguenti link: - unicode.org/Public/UNIDATA/SpecialCasing.txt - stackoverflow.com/questions/23524231/... - en.wikipedia. org / wiki / Dotted_and_dotless_I
azat

Nel tuo esempio, borsa 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
Sergiy Kolodyazhnyy

20

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.


2
+1 Incredibile, non l'ho mai saputo! btw qualche informazione in più: ho guardato questo in su nel manuale e sembra che typesetè considerato depricated e sostituirlo condeclare
Thom

1
@thom grazie, sembra che Bash abbia iniziato ad avere una vita lontana dalle sue "radici di bourne shell" :)
Emmanuel,

17

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:

inserisci qui la descrizione dell'immagine

Il merito va alla cybercity


2
Se non ti interessa i locali, tr A-Z a-zfunzionerà anche.
Nick Matteo,

9

Puoi anche reindirizzare le cose sed:

$ echo lowercase | sed 's/.*/\U&/'
LOWERCASE

E \Lavrà l'effetto opposto:

$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase

1

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

-1

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

1
Come notato in un commento su una risposta precedente , questo non funzionerà per alcune versioni locali.
Muru,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.