¿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:
trserí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
sedy 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,
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 esotrsirve (transliterar):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, enStéphane Chazelasconfiguraciones regionales UTF-8, eso da ensTéPHANE cHAZELASlugar desTÉPHANE cHAZELAS. Esa es una limitación conocida de GNUtr.trde la herencia de herramientas de la herencia, eso no funciona (obtienessté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: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 seiconvierteİ). La razón por la que no funciona con GNUtres que GNUtrfunciona 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 ybd -> 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:SALIDA
Yo tiro
stderrhacia/dev/nullallí porqueddtambién proporciona estadísticas de todas sus operaciones en el2descriptor 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 hacerddaún se aplican, por ejemplo:SALIDA:
fuente
aBcque no se convierte enAbC).Si su objetivo principal es convertir un archivo de clase inferior a clase superior, ¿por qué no utiliza
trySTDOUTpara convertir su archivo?¿Dónde
FILENAMEestá tu archivo original? ¿DóndeFILENAME2está tu archivo de salida convertido?fuente
épor ejemplo (al menos en mi archivo).utilizando
awk:fuente
>file.txtcomenzaría truncando el archivorubytiene un método de cadena para eso, uso similar de la línea de comando comoperlVer también codificación ruby-doc
fuente
Mantenga la cosa simple simple. El filtro diseñado para traducir caracteres es
tr.fuente