Réponses:
Voici une façon simple de sed:
$ echo qWeRtY | sed -e 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'
QwErTy
ou d'une manière plus courte avec GNU sed, en travaillant avec n'importe quel caractère pour lequel une conversion en minuscules <-> majuscules existe dans votre environnement local:
$ echo qWeRtY | sed -E 's/([[:lower:]])|([[:upper:]])/\U\1\L\2/g'
QwErTy
si vous pouvez utiliser un autre outil, comme:
perl (limité aux lettres ASCII):
$ echo qWeRtY | perl -pe 'y/[a-z][A-Z]/[A-Z][a-z]/'
QwErTy
perl (plus généralement):
$ echo 'αΒγ' | perl -Mopen=locale -pe 's/(\p{Ll})|(\p{Lu})/uc($1).lc($2)/ge'
ΑβΓ
sedet un cas alternatif dans l'entrée. Utilisez à la sed -re 's/([[:lower:]]?)([[:upper:]]?)/\U\1\L\2/g'place (toujours spécifique à GNU). La première convertit uniquement les 26 lettres latines ASCII, tandis que la seconde convertit toute lettre reconnue comme telle par votre environnement local. L' trun n'a de sens que dans les paramètres régionaux ASCII. Celui perlne fonctionne que pour les lettres latines ASCII.
POSIX, cela ne peut pas être fait sedsauf en fournissant l'ensemble complet de lettres que vous souhaitez translittérer comme l' a montré @cuonglm .
Cela pourrait être fait avec tr, et c'est à cela que trsert (translittération):
tr '[:lower:][:upper:]' '[:upper:][:lower:]'
Cependant, sous Linux, il a des limites. Sur les 3 trimplémentations couramment trouvées sur les systèmes Linux:
tr, qui ne fonctionne que pour les jeux de caractères à un octet. Par exemple, Stéphane Chazelasdans les locales UTF-8, cela donne à la sTéPHANE cHAZELASplace de sTÉPHANE cHAZELAS. C'est une limitation connue de GNU tr.trde l'héritage toolchest, cela ne fonctionne pas (vous obtenez stéphane chazelas).trfera.Sur FreeBSD, cela fonctionne bien. Vous vous attendriez à ce que cela fonctionne également dans les systèmes Unix certifiés.
Le bashshell 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]}}
ⴠ(e2 b4 a0) est Ⴠ(e1 83 80); deux i(69) et ı(c4 b1) ont I(49) en majuscules (sauf dans des endroits où la Turquie idevient İ). La raison pour laquelle cela ne fonctionne pas avec GNU trest que GNU trfonctionne avec des octets et non avec des caractères.
[:lower:]or [:upper:](donc la première est ignorée). Même en français, œ -> Œest c5 93 -> c5 92en UTF-8 et bd -> bcen iso8859-15.
Bien que cela ait les mêmes limites déjà mentionnées que la trsolution 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
qwertyqwerty
QWERTYQWERTY
Je larguer stderren /dev/nulllà parce que ddfournit également des statistiques de toutes ses opérations sur le 2descripteur de fichier. Cela peut être utile selon ce que vous faites, mais ce n'était pas le cas pour cette démonstration. Toutes les autres choses que vous pouvez faire dds'appliquent toujours, par exemple:
echo QWERTYqwerty | dd bs=1 cbs=6 conv=unblock,ucase 2>/dev/null
QWERTY
QWERTY
aBcn'est pas converti en AbC).
Si votre objectif principal est de convertir un fichier de classe inférieure en classe supérieure, pourquoi ne l'utilisez-vous pas tret STDOUTpour convertir votre fichier:
$cat FILENAME | tr a-z A-Z > FILENAME2
Où se FILENAMEtrouve votre fichier d'origine. Où se FILENAME2trouve votre fichier de sortie converti.
épar exemple (au moins dans mon fichier).
utilisant awk:
awk '{print tolower($0)}' file.txt | tee file.txt
>file.txtcommencerait par tronquer le fichier
ruby a une méthode de chaîne pour cela, une utilisation similaire à partir de la ligne de commande comme perl
$ echo 'qWeRtY' | ruby -pe '$_.swapcase!'
QwErTy
Voir aussi Ruby-doc Encoding
$ ruby -e 'puts Encoding.default_external'
UTF-8
$ echo 'αΒγ' | ruby -pe '$_.swapcase!'
ΑβΓ
Restez simple. Le filtre conçu pour traduire les caractères est tr.
echo 1ude1UDE | tr [:upper:][:lower:] [:lower:][:upper:]
trserait plus approprié quesed.