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'
ΑβΓ
sedy 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, sedexcepto al proporcionar el conjunto completo de letras que desea transliterar como se ha mostrado en @cuonglm .
Sin trembargo, podría hacerse con , y para eso trsirve (transliterar):
tr '[:lower:][:upper:]' '[:upper:][:lower:]'
Sin embargo, en Linux, tiene limitaciones. De las 3 trimplementaciones 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 Chazelasconfiguraciones regionales UTF-8, eso da en sTéPHANE cHAZELASlugar de sTÉPHANE cHAZELAS. Esa es una limitación conocida de GNU tr.trde la herencia de herramientas de la herencia, eso no funciona (obtienes stéphane chazelas).trhará.Sin embargo, en FreeBSD funciona bien. Es de esperar que funcione bien en sistemas Unix certificados también.
El bashshell 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 iconvierte İ). La razón por la que no funciona con GNU tres que GNU trfunciona con bytes y no con caracteres.
[:lower:]o [:upper:](por lo que se ignora la primera). Incluso en francés, œ -> Œestá c5 93 -> c5 92en UTF-8 y bd -> bcen iso8859-15.
Aunque esto tiene las mismas limitaciones ya mencionadas como la trsolució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 stderrhacia /dev/nullallí porque ddtambién proporciona estadísticas de todas sus operaciones en el 2descriptor 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 ddaún se aplican, por ejemplo:
echo QWERTYqwerty | dd bs=1 cbs=6 conv=unblock,ucase 2>/dev/null
QWERTY
QWERTY
aBcque no se convierte en AbC).
Si su objetivo principal es convertir un archivo de clase inferior a clase superior, ¿por qué no utiliza try STDOUTpara convertir su archivo?
$cat FILENAME | tr a-z A-Z > FILENAME2
¿Dónde FILENAMEestá tu archivo original? ¿Dónde FILENAME2está tu archivo de salida convertido?
épor ejemplo (al menos en mi archivo).
utilizando awk:
awk '{print tolower($0)}' file.txt | tee file.txt
>file.txtcomenzarí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:]
trsería más adecuado quesed.