Respuestas:
Aquí hay una forma directa de sed
:
$ echo qWeRtY | sed -e 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'
QwErTy
o una forma más corta con GNU sed
, trabajando con cualquier carácter para el que exista una conversión en minúscula <-> mayúscula en su localidad:
$ echo qWeRtY | sed -E 's/([[:lower:]])|([[:upper:]])/\U\1\L\2/g'
QwErTy
si puedes usar otras herramientas, como:
perl
(limitado a letras ASCII):
$ echo qWeRtY | perl -pe 'y/[a-z][A-Z]/[A-Z][a-z]/'
QwErTy
perl
(más generalmente):
$ echo 'αΒγ' | perl -Mopen=locale -pe 's/(\p{Ll})|(\p{Lu})/uc($1).lc($2)/ge'
ΑβΓ
sed
y un caso alternativo en la entrada. Utilice en su sed -re 's/([[:lower:]]?)([[:upper:]]?)/\U\1\L\2/g'
lugar (todavía GNU específico). La primera solo convierte las 26 letras latinas ASCII, mientras que la segunda convierte cualquier letra reconocida como tal por su localidad. El tr
único tiene sentido en las configuraciones regionales ASCII. El perl
único funciona para letras latinas ASCII.
POSITIVAMENTE, eso no se puede hacer, sed
excepto al proporcionar el conjunto completo de letras que desea transliterar como se ha mostrado en @cuonglm .
Sin tr
embargo, podría hacerse con , y para eso tr
sirve (transliterar):
tr '[:lower:][:upper:]' '[:upper:][:lower:]'
Sin embargo, en Linux, tiene limitaciones. De las 3 tr
implementaciones que se encuentran comúnmente en sistemas basados en Linux:
tr
, eso solo funciona para conjuntos de caracteres de un solo byte. Por ejemplo, en Stéphane Chazelas
configuraciones regionales UTF-8, eso da en sTéPHANE cHAZELAS
lugar de sTÉPHANE cHAZELAS
. Esa es una limitación conocida de GNU tr
.tr
de la herencia de herramientas de la herencia, eso no funciona (obtienes stéphane chazelas
).tr
hará.Sin embargo, en FreeBSD funciona bien. Es de esperar que funcione bien en sistemas Unix certificados también.
El bash
shell tiene un operador dedicado para eso:
in=AbCdE
out=${in~~}
Con zsh -o extendedglob
:
out=${in//(#b)(([[:lower:]])|([[:upper:]]))/${(U)match[2]}${(L)match[3]}}
ⴠ
(e2 b4 a0) es Ⴠ
(e1 83 80); ambos i
(69) y ı
(c4 b1) tienen I
(49) como mayúsculas (excepto en los locales turcos donde se i
convierte İ
). La razón por la que no funciona con GNU tr
es que GNU tr
funciona con bytes y no con caracteres.
[:lower:]
o [:upper:]
(por lo que se ignora la primera). Incluso en francés, œ -> Œ
está c5 93 -> c5 92
en UTF-8 y bd -> bc
en iso8859-15.
Aunque esto tiene las mismas limitaciones ya mencionadas como la tr
solución ofrecida por Stéphane Chazelas, es otra forma de hacerlo:
{ echo QWERTYqwerty | dd conv=lcase
echo QWERTYqwerty | dd conv=ucase
} 2>/dev/null
qwertyqwerty
QWERTYQWERTY
Yo tiro stderr
hacia /dev/null
allí porque dd
también proporciona estadísticas de todas sus operaciones en el 2
descriptor de archivo. Esto puede ser útil dependiendo de lo que esté haciendo, pero no fue para esta demostración. Todas las demás cosas que puede hacer dd
aún se aplican, por ejemplo:
echo QWERTYqwerty | dd bs=1 cbs=6 conv=unblock,ucase 2>/dev/null
QWERTY
QWERTY
aBc
que no se convierte en AbC
).
Si su objetivo principal es convertir un archivo de clase inferior a clase superior, ¿por qué no utiliza tr
y STDOUT
para convertir su archivo?
$cat FILENAME | tr a-z A-Z > FILENAME2
¿Dónde FILENAME
está tu archivo original? ¿Dónde FILENAME2
está tu archivo de salida convertido?
é
por ejemplo (al menos en mi archivo).
utilizando awk
:
awk '{print tolower($0)}' file.txt | tee file.txt
>file.txt
comenzaría truncando el archivo
ruby
tiene un método de cadena para eso, uso similar de la línea de comando como perl
$ echo 'qWeRtY' | ruby -pe '$_.swapcase!'
QwErTy
Ver también codificación ruby-doc
$ ruby -e 'puts Encoding.default_external'
UTF-8
$ echo 'αΒγ' | ruby -pe '$_.swapcase!'
ΑβΓ
Mantenga la cosa simple simple. El filtro diseñado para traducir caracteres es tr
.
echo 1ude1UDE | tr [:upper:][:lower:] [:lower:][:upper:]
tr
sería más adecuado quesed
.