Quelle est la commande Bash que je peux utiliser pour convertir une chaîne en majuscule en minuscule et vice-versa?
Je vous remercie.
Si la chaîne est déjà stockée dans une variable, vous pouvez utiliser le paramètre de développement de bash
name__, plus précisément, ${parameter,,pattern}
(disponible depuis bash 4.0), où parameter
est le nom de votre variable et pattern
est 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 zsh
name__, 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 bash
ne fonctionne pas dans zsh
name__ 1). L'indicateur pour les minuscules est L
name__; pour les majuscules, il s'agit de U
name__:
$ 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 zsh
ne fonctionne pas dans bash
name __.
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Ą
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.
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:
Le crédit va à cybercity
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
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