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

Réponses:

59

Si la chaîne est déjà stockée dans une variable, vous pouvez utiliser bashle développement de paramètres, spécifiquement ${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 zsh, vous pouvez utiliser les drapeaux d’expansion de paramètres ( ${(FLAGS)NAME}disponibles depuis zsh 2.5) pour obtenir les mêmes résultats. La bashsyntaxe ne fonctionne pas dans zsh 1) . Le drapeau pour les minuscules est L; pour les majuscules c'est U:

$ 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 beaucoup plus longtemps, il devrait probablement être: "la zshsyntaxe ne fonctionne pas dansbash .

Adaephon
la source
3
La ${string,,}notation n'existe que pour bash version 4+. Sinon, une des autres solutions est requise, telle que $(echo $string | tr '[:upper:]' '[:lower:]').
Quinn Comendant
40

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 declare 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 fonctionne pas :

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

bash 4.3.42 declareet travaux d’ extension des paramètres :

$ 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 fonctionne pas :

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

Python 2 sans 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Ą
Michał Šrajer
la source
1
Sur Ubuntu 13.04, j'ai gawkAwk par défaut (comme indiqué avec update-alternatives --display awk). Êtes-vous sûr que mawkla valeur par défaut est 13.10?
Kiri
seds depuis 1990 ont soutenu l’ \Uoption ;-). Pas une caractéristique spécifique de Gnu-sed. Sinon, bonne réponse, tellement d'options, donc peu de temps ;-) Bonne chance à tous!
shellter
De plus, il y aura quelques problèmes avec le turc (pointillé et sans points i), pour plus de détails, consultez les liens suivants: - unicode.org/Public/UNIDATA/SpecialCasing.txt - stackoverflow.com/questions/23524231/… - en.wikipedia. org / wiki / Dotted_and_dotless_I
mardi
Dans votre exemple, le sac à main ucne fonctionne pas en Perl car vous devez le faire use Encodeou use utf8. Réécrivez votre exemple au fur echo "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))'et à mesure et cela fonctionnera. Voir aussi stackoverflow.com/a/13261662/3701431
Sergiy Kolodyazhnyy le
20

J'utiliserais la commande interne typet ou declare de bash 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. En majuscule, vous pouvez composer -u .

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

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

EDIT: Beaucoup de gens m'ont gentiment pointé le fait que la composition est maintenant considérée comme obsolète sur bash et remplacée par declare . 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.

J'utilise moi-même toujours la syntaxe de composition en travaillant dans un environnement hétérogène, je ne dois donc pas réécrire mes scripts.

Emmanuel
la source
2
+1 Incroyable, je ne l'ai jamais su! BTW quelques informations supplémentaires: Je regardais ce dans le manuel et il semble que typesetest considéré comme depricated et remplacé pardeclare
thom
1
@thom merci, il semblerait que bash ait commencé à avoir une vie loin de ses "racines d'enveloppe" :)
Emmanuel
17

Vous pouvez le faire avec la trcommande.

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:

entrez la description de l'image ici

Le crédit va à la cybercité

rɑːdʒɑ
la source
2
Si vous ne vous souciez pas des lieux, tr A-Z a-zcela fonctionnera aussi.
Nick Matteo
9

Vous pouvez sedaussi faire passer des choses :

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

Et \Laura l'effet inverse:

$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase
Oli
la source
1

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

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

Et \Laura l'effet inverse:

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

Utilisez cette commande simple Pour les majuscules aux minuscules Où 'f' est le nom du fichier où vous souhaitez effectuer la conversion.

tr "A-Z" "a-z" < f

Pour minuscule à majuscule

tr "a-z" "A-Z" < f
jack
la source
1
Comme indiqué dans un commentaire sur une réponse plus ancienne , cela ne fonctionnera pas pour certains paramètres régionaux.
Muru