web-dev-qa-db-fra.com

Commande pour convertir une chaîne en majuscule en minuscule?

Quelle est la commande Bash que je peux utiliser pour convertir une chaîne en majuscule en minuscule et vice-versa?

Je vous remercie.

46
rɑːdʒɑ

Si la chaîne est déjà stockée dans une variable, vous pouvez utiliser le paramètre de développement de bashname__, plus précisément, ${parameter,,pattern} (disponible depuis bash 4.0), où parameterest le nom de votre variable et patternest omis:

$ string="Hello, World!"
$ echo $string
Hello, World!
$ echo ${string,,}
hello, world!

Notez que cela ne change pas la valeur de la variable, mais uniquement la sortie. Pour changer la variable, vous devez attribuer la nouvelle valeur:

$ echo $string
Hello, World!
$ string=${string,,}
$ echo $string
hello, world!

La conversion en majuscule fonctionne avec ${parameter^^pattern}:

$ echo ${string^^}
HELLO, WORLD!

Cela fonctionne aussi avec les chaînes Unicode (au moins avec les versions actuelles de bash, nécessite probablement au moins bash 4.3):

$ string='ἈΛΦΆβητος'
$ echo ${string,,}
ἀλφάβητος
$ echo ${string^^}
ἈΛΦΆΒΗΤΟΣ

Si vous utilisez zshname__, vous pouvez utiliser drapeaux d'expansion des paramètres (${(FLAGS)NAME}; disponible depuis zsh 2.5) pour obtenir les mêmes résultats. La syntaxe bashne fonctionne pas dans zshname__ 1). L'indicateur pour les minuscules est Lname__; pour les majuscules, il s'agit de Uname__:

$ string="Hello, World!"
$ echo ${(L)string}
hello, world!
$ echo ${(U)string}
HELLO, WORLD!
$ echo $string
Hello, World!"

Cela fonctionne aussi avec les chaînes Unicode (au moins depuis zsh 5.0; je n'ai pas essayé avec les versions précédentes):

$ string='ἈΛΦΆβητος'
$ echo ${(L)string} 
ἀλφάβητος
$ echo ${(U)string}  
ἈΛΦΆΒΗΤΟΣ


1) Bien que, vu que zsh l’ait depuis bien plus longtemps, il devrait probablement être: "la syntaxe zshne fonctionne pas dans bashname __.

59
Adaephon

Très peu de méthodes fonctionnent correctement avec Unicode:

GNU sed 4.2.2 fonctionne :

$ echo "Idą gęsi łąką" | sed 's/.*/\U&/'
IDĄ GĘSI ŁĄKĄ

bash 4.2.45 déclare que ne fonctionne pas :

$ typeset -u ucase; ucase="Idą gęsi łąką"; echo $ucase
IDą GęSI łąKą

l’extension du paramètre bash 4.2.45 ne ne fonctionne pas :

$ str="Idą gęsi łąką"; echo ${str^^}
IDą GęSI łąKą

bash 4.3.42 declare et l’extension du paramètre fonctionnent :

$ declare -u ucase
$ ucase="Idą gęsi łąką"
$ echo $ucase
IDĄ GĘSI ŁĄKĄ
$ echo ${ucase,,}
idą gęsi łąką

GNU tr 8.20 ( ne fonctionne pas :

$ echo "Idą gęsi łąką" | tr '[:lower:]' '[:upper:]'
IDą GęSI łąKą

mawk (awk par défaut dans Ubuntu 13.10) ne fonctionne pas :

$ echo "Idą gęsi łąką" | mawk '{print toupper($0)}'
IDą GęSI łąKą

gawk fonctionne :

$ echo "Idą gęsi łąką" | gawk '{print toupper($0)}'
IDĄ GĘSI ŁĄKĄ

Perl pure uc () ne ne fonctionne pas :

$ echo "Idą gęsi łąką" | Perl -ne 'print uc($_);'
IDą GęSI łąKą

Python 2 sans aucune indication Unicode ne fonctionne pas :

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().upper(),'
IDą GęSI łąKą

Python 2 lorsqu'il est demandé de traiter avec Unicode fonctionne :

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().decode("utf-8").upper(),'
IDĄ GĘSI ŁĄKĄ

Python 3 fonctionne :

$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
IDĄ GĘSI ŁĄKĄ
40
Michał Šrajer

Je voudrais utiliser la commande interne bash typeset ou declare pour définir une variable minuscule.

$ typeset -l lcase
$ lcase="LoWeR cAsE"
$ echo $lcase
lower case

Les caractères sont réduits lorsque la valeur est définie, pas lorsque vous composez la variable. Il est donc préférable de composer au début du script. Pour les majuscules, vous pouvez typeset -.

$ typeset -u ucase
$ ucase="Upper cAsE"
$ echo $ucase
UPPER CASE

Ce n'est pas spécifique à bash Shell, cela fonctionne aussi sur ksh, peut-être dans la définition de POSIX Shell.

EDIT: Beaucoup de gens m'ont gentiment pointé le fait que dactylographié est maintenant considéré obsolète à la bash et remplacé par déclarez. Les deux commandes sont équivalentes.

$ 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.

Moi-même, j'utilise toujours la syntaxe dactylographique lorsque je travaille dans un environnement hétérogène. Je ne dois donc pas réécrire mes scripts.

20
Emmanuel

Vous pouvez le faire avec la commande tr.

Dans le terminal (Ctrl+Alt+T)

Cette commande:

echo 'String here' | tr "[:lower:]" "[:upper:]"

convertira les minuscules en majuscules.

echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"

convertira les majuscules en minuscules.

Exemple:

enter image description here

Le crédit va à cybercity

16
rɑːdʒɑ

Vous pouvez également transférer des éléments via sed:

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

Et \L aura l'effet inverse:

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

Ce n'est pas une solution pure bash, mais vous pouvez diriger vos chaînes via Perl (comme Oli l'a fait avec sed):

$ echo lowercase | Perl -ne 'print "\U$_"'
LOWERCASE

Et \L aura l'effet inverse:

$ echo UPPERCASE | Perl -ne 'print "\L$_"'
uppercase
1
Sylvain Pineau