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'
ΑβΓ
sed
et 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' tr
un n'a de sens que dans les paramètres régionaux ASCII. Celui perl
ne fonctionne que pour les lettres latines ASCII.
POSIX, cela ne peut pas être fait sed
sauf 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 tr
sert (translittération):
tr '[:lower:][:upper:]' '[:upper:][:lower:]'
Cependant, sous Linux, il a des limites. Sur les 3 tr
implé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 Chazelas
dans les locales UTF-8, cela donne à la sTéPHANE cHAZELAS
place de sTÉPHANE cHAZELAS
. C'est une limitation connue de GNU tr
.tr
de l'héritage toolchest, cela ne fonctionne pas (vous obtenez stéphane chazelas
).tr
fera.Sur FreeBSD, cela fonctionne bien. Vous vous attendriez à ce que cela fonctionne également dans les systèmes Unix certifiés.
Le bash
shell 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 i
devient İ
). La raison pour laquelle cela ne fonctionne pas avec GNU tr
est que GNU tr
fonctionne 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 92
en UTF-8 et bd -> bc
en iso8859-15.
Bien que cela ait les mêmes limites déjà mentionnées que la tr
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
qwertyqwerty
QWERTYQWERTY
Je larguer stderr
en /dev/null
là parce que dd
fournit également des statistiques de toutes ses opérations sur le 2
descripteur 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 dd
s'appliquent toujours, par exemple:
echo QWERTYqwerty | dd bs=1 cbs=6 conv=unblock,ucase 2>/dev/null
QWERTY
QWERTY
aBc
n'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 tr
et STDOUT
pour convertir votre fichier:
$cat FILENAME | tr a-z A-Z > FILENAME2
Où se FILENAME
trouve votre fichier d'origine. Où se FILENAME2
trouve votre fichier de sortie converti.
é
par exemple (au moins dans mon fichier).
utilisant awk
:
awk '{print tolower($0)}' file.txt | tee file.txt
>file.txt
commencerait 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:]
tr
serait plus approprié quesed
.