Convertir tout le text de majuscules en minuscules et vice versa?

Ma question est comment puis-je convertir tout le text de majuscules en minuscules et vice versa? C'est pour changer les cas de toutes les lettres. Cela doit être fait avec un rlocation sed quelque sorte.

Voici une façon simple de sed :

 $ echo qWeRtY | sed -e 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/' QwErTy 

ou un path plus court (avec GNU sed ):

 $ echo qWeRtY | sed -E 's/([[:lower:]])|([[:upper:]])/\U\1\L\2/g' QwErTy 

si vous pouvez utiliser d'autres outils, comme:

perl :

 $ echo qWeRtY | perl -pe 'y/[az][AZ]/[AZ][az]/' QwErTy 

POSIXly, cela ne peut pas être fait avec sed sauf en fournissant l'set complet des lettres que vous voulez translittérer comme @cuonglm l'a montré .

Cela pourrait être fait avec tr cependant, et c'est ce que tr est pour (translittéré):

 tr '[:lower:][:upper:]' '[:upper:][:lower:]' 

Cependant, sous Linux, il y a des limites. Parmi les implémentations de 3 tr couramment trouvées sur les systèmes basés sur Linux:

  • avec GNU tr , qui ne fonctionne que pour les jeux de caractères à un seul octet. Par exemple, sur Stéphane Chazelas dans les environnements UTF-8, cela donne sTéPHANE cHAZELAS au lieu de sTÉPHANE cHAZELAS . C'est une limitation connue de GNU tr .
  • avec tr de la barre d'outils pasortingmoniale, ça ne marche pas (vous obtenez stéphane chazelas ).
  • Ce n'est pas le genre de chose que busybox tr fera.

Sur FreeBSD qui fonctionne bien cependant. Vous vous attendez à ce qu'il fonctionne correctement dans les systèmes Unix certifiés.


Le shell bash a un opérateur dédié pour cela:

 in=AbCdE out=${in~~} 

Avec zsh -o extendedglob :

 out=${in//(#b)(([[:lower:]])|([[:upper:]]))/${(U)match[2]}${(L)match[3]}} 

en utilisant awk :

 awk '{print tolower($0)}' file.txt > file.txt 

Bien que cela ait les mêmes limites déjà mentionnées que la solution proposée par Stéphane Chazelas, c'est une autre façon de le faire:

 { echo QWERTYqwerty | dd conv=lcase echo QWERTYqwerty | dd conv=ucase } 2>/dev/null 

SORTIE

 qwertyqwerty QWERTYQWERTY 

Je jette stderr dans /dev/null car dd fournit également des statistics de toutes ses opérations sur le descripteur de 2 files. Cela peut être utile selon ce que vous faites, mais pas pour cette démonstration. Toutes les autres choses que vous pouvez faire avec dd s'applique toujours, par exemple:

 echo QWERTYqwerty | dd bs=1 cbs=6 conv=unblock,ucase 2>/dev/null 

SORTIE:

 QWERTY QWERTY 

Gardez la chose simple simple. Le filter conçu pour traduire les caractères est tr .

 echo 1ude1UDE | tr [:upper:][:lower:] [:lower:][:upper:]