¿Convertir todo el texto de mayúsculas a minúsculas y viceversa?
17
Mi pregunta es ¿cómo puedo convertir todo el texto de mayúsculas a minúsculas y viceversa? Eso es cambiar los casos de todas las letras. Tiene que hacerse con un sedreemplazo de alguna manera.
Su segundo asume un GNU 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.
Stéphane Chazelas
16
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:
con GNU 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.
con trde la herencia de herramientas de la herencia, eso no funciona (obtienes stéphane chazelas).
Ese no es el tipo de cosas que busybox trhará.
Sin embargo, en FreeBSD funciona bien. Es de esperar que funcione bien en sistemas Unix certificados también.
Entonces, ¿en el mundo de escritorio solo OSX lo hace? ¿Por qué no puede funcionar? ¿Son solo las diferentes implementaciones, ya que parece que hay un desplazamiento constante en el valor hexadecimal entre la versión en minúsculas del carácter acentuado y su contraparte en mayúscula?
1
@ illuminÉ, no estoy seguro de lo que quieres decir con mundo de escritorio . AFAICS, el problema es con GNU, la mayoría de los Unices tienen "escritorios". Además de ASCII y algunos conjuntos de caracteres iso8859, no sé si se puede generalizar el desplazamiento hexagonal, y eso no tendría sentido con codificaciones como UTF-8. Por ejemplo, en UTF-8, mayúscula ⴠ(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.
Stéphane Chazelas
Me refería a la corriente principal, pero en realidad no tiene sentido, así que gracias por el aviso. Solo miré los caracteres acentuados en francés (y realmente solo "é") e hice suposiciones muy simplistas, olvidando nuevamente que se trata de bytes. ¿Pero la reliquia? ¡Iré a leer esa respuesta otra vez!
1
@ illuminÉ, para la herencia, es un problema diferente, parece que solo admite una aparición de [: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.
Stéphane Chazelas
2
Aunque esto tiene las mismas limitaciones ya mencionadas como la trsolución ofrecida por Stéphane Chazelas, es otra forma de hacerlo:
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:
tr
sería más adecuado quesed
.Respuestas:
Aquí hay una forma directa de
sed
: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:si puedes usar otras herramientas, como:
perl
(limitado a letras ASCII):perl
(más generalmente):fuente
sed
y un caso alternativo en la entrada. Utilice en sused -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. Eltr
único tiene sentido en las configuraciones regionales ASCII. Elperl
ú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 esotr
sirve (transliterar):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, enStéphane Chazelas
configuraciones regionales UTF-8, eso da ensTéPHANE cHAZELAS
lugar desTÉPHANE cHAZELAS
. Esa es una limitación conocida de GNUtr
.tr
de la herencia de herramientas de la herencia, eso no funciona (obtienessté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:Con
zsh -o extendedglob
:fuente
ⴠ
(e2 b4 a0) esჀ
(e1 83 80); ambosi
(69) yı
(c4 b1) tienenI
(49) como mayúsculas (excepto en los locales turcos donde sei
convierteİ
). La razón por la que no funciona con GNUtr
es que GNUtr
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 ybd -> 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:SALIDA
Yo tiro
stderr
hacia/dev/null
allí porquedd
también proporciona estadísticas de todas sus operaciones en el2
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 hacerdd
aún se aplican, por ejemplo:SALIDA:
fuente
aBc
que no se convierte enAbC
).Si su objetivo principal es convertir un archivo de clase inferior a clase superior, ¿por qué no utiliza
tr
ySTDOUT
para convertir su archivo?¿Dónde
FILENAME
está tu archivo original? ¿DóndeFILENAME2
está tu archivo de salida convertido?fuente
é
por ejemplo (al menos en mi archivo).utilizando
awk
:fuente
>file.txt
comenzaría truncando el archivoruby
tiene un método de cadena para eso, uso similar de la línea de comando comoperl
Ver también codificación ruby-doc
fuente
Mantenga la cosa simple simple. El filtro diseñado para traducir caracteres es
tr
.fuente