Pasar Mayusculas a Minusculas en Linux

Hoy estabamos comentando un compañero de trabajo y yo diferentes formas de convertir mayúsculas a minúsculas en Linux y he decidido plasmarlo en un post para futura referencia.

Aunque seguramente hay más formas de hacerlo, se nos han ocurrido cuatro diferentes a botepronto. Si aparecen más mediante comentarios de la gente o porque se me ocurran, iré ampliando este post.

Cambiar Mayusculas / Minusculas con TR

La sintaxis de tr es bastante sencilla y se asemeja en cierta forma a la que podemos estar acostumbrados en BBCode en diferentes aplicaciones dedicadas a foros.

Convertir Mayusculas a Minusculas con TR

Aqui indicamos a tr que partimos de mayusculas para convertirlas en minusculas

javi@trabajo:/tmp$ echo JAVIERIN.COM |tr [[:upper:]] [[:lower:]]
javierin.com

Convertir Minusculas a Mayusculas con TR

Aqui indicaremos que los strings de partida son en minusculas para pasarlos a mayusculas.

javi@trabajo:/tmp$ echo javierin.com |tr [[:lower:]] [[:upper:]]
JAVIERIN.COM

Cambiar Minusculas / Mayusculas con BASH

La siguiente forma de pasar de mayusculas a minusculas en linux es mediante el uso del comando echo de bash. Esta forma necesita una versión de Bash 4.0 o superior.

Convertir Minusculas a Mayusculas con BASH

En esta forma, usamos el ^^ en el echo para indicar que buscamos convertir minusculas a mayusculas.

javi@trabajo:/tmp$ variable="javierin.com"; echo ${variable^^}
JAVIERIN.COM

Convertir Mayusculas a Minusculas con BASH

En esta forma, usamos las ,, para indicar que queremos pasar a minusculas la variable.

javi@trabajo:/tmp$ variable="JAVIERIN.COM"; echo ${variable,,}
javierin.com

Cambiar Minusculas / Mayusculas con AWK

La siguiente forma de pasar de mayusculas a minusculas en linux es mediante el uso de awk. Awk es un potentísimo comando sobre el que se han escrito libros de cientos de páginas con el que podemos manipular de formas inimaginables el texto en nuestros scripts.

Convertir Minusculas a Mayusculas con AWK

En este ejemplo usaremos el comando toupper de awk para convertir la entrada a mayusculas

javi@trabajo:/tmp$ echo "javierin.com" |awk '{print toupper($0)}'
JAVIERIN.COM

Convertir Mayusculas a Minusculas con AWK

En este ejemplo usaremos el comando tolower para transformar la entrada a minusculas.

javi@trabajo:/tmp$ echo "JAVIERIN.COM" |awk '{print tolower($0)}'
javierin.com

Cambiar Minusculas / Mayusculas con PERL

La siguiente forma de pasar de mayusculas a minusculas en linux es mediante el uso de perl. Usaremos parámetros  lc / uc de su función print para formatear la salida de la misma.

Convertir Minusculas a Mayusculas con PERL

En este ejemplo usaremos la función print uc de perl para convertir la entrada a mayusculas

javi@trabajo:/tmp$ echo "JAVIERIN.COM" |perl -ne 'print lc'
javierin.com

Convertir Mayusculas a Minusculas con PERL

En este ejemplo usaremos la función print lc de perl para convertir la entrada a mayusculas

javi@trabajo:/tmp$ echo "javierin.com" |perl -ne 'print uc'
JAVIERIN.COM

¿Cual es el metodo más rápido para pasar de mayusculas a minusculas / minusculas a mayusculas?

Pues la respuesta es: Depende

Velocidad en pasar strings pequeños de minusculas a mayusculas

Si vas a manejar bloques pequeños de texto, sin duda el más rápido es bash.

TR tarda 14.37 segundos en pasar a mayúsculas el conocido Loren Ipsum 5000 veces. Al ser llamadas a binarios externos, el tiempo real de conversión es 4.6 Segundos.

javi@trabajo:/tmp$ time for i in `seq 1 5000`; do echo "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." | tr [[:lower:]] [[:upper:]] > /dev/null; done

real 0m14.374s
user 0m4.668s
sys 0m17.414s

Bash tarda solo 0.4 segundos en hacer la transformación 5000 veces.

javi@trabajo:/tmp$ lorenipsum="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; time for i in `seq 1 5000`; do echo ${lorenipsum^^} > /dev/null; done

real 0m0.396s
user 0m0.380s
sys 0m0.014s

AWK por su parte se toma un poco menos de tiempo que TR, 4.3 segundos, aunque el binario parece ser un pelín más pesado de invocar.

javi@trabajo:/tmp$ time for i in `seq 1 5000`; do echo "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." | awk '{print toupper ($0)}' > /dev/null; done

real 0m14.460s
user 0m4.351s
sys 0m16.959s

Perl tarda 8.6 segundos en hacer 5000 transformaciones de Loren Ipsum a mayúsculas, y además, tarda más que el resto en ser invocado.

javi@trabajo:/tmp$ time for i in `seq 1 5000`; do echo "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." | perl -ne 'print uc' > /dev/null; done

real 0m19.725s
user 0m8.685s
sys 0m20.238s

CUIDADO, porque si tratamos con archivos grandes, la cosa cambia y muchísimo.

Velocidad en pasar textos grandes de minusculas a mayusculas

Utilizaremos el Quijote y sus 2.2 Mbytes de texto plano, para hacer la transformación 200 veces (salvo en el caso de bash)

TR sigue siendo el más rápido al convertir a mayúsculas. Esta vez con bastante diferencia.

root@fr1:/tmp/b# time for i in `seq 1 200`; do cat quijote.txt | tr [[:lower:]] [[:upper:]] >> /dev/null; done

real 0m1.609s
user 0m0.332s
sys 0m0.900s

BASH se vuelve insufriblemente lento, tardando 2 minutos y 12 segundos en hacer la transformación a mayúsculas 1 vez. 

root@fr1:/tmp/b# v=$(cat quijote.txt); time echo ${v^^} >> /dev/null

real 2m12.499s
user 2m12.404s
sys 0m0.004s

AWK tarda 3 segundos en hacer la transformación 200 veces, el subcampeón de la prueba de conversión a mayúsculas.

root@fr1:/tmp/b# time for i in `seq 1 200`; do cat quijote.txt | awk '{print toupper($0)}' >> /dev/null; done

real 0m4.245s
user 0m2.964s
sys 0m0.832s

Perl por su parte se porta bastante bien, mucho mejor que con los strings más cortos, y es un muy digno tercer finalista.

root@fr1:/tmp/b# time for i in `seq 1 200`; do cat quijote.txt | perl -ne 'print uc' >> /dev/null; done

real 0m4.716s
user 0m3.592s
sys 0m0.748s

Así que como regla de oro, usa bash para pasar de mayusculas a minusculas o para convertir de minúsculas a mayúsculas SOLO si los fragmentos de texto son strings cortas. Si no sabes el tamaño de lo que puedes transformar, o sabes de antemano que vas a convertir textos grandes, te recomiendo que uses tr o awk.

mayusculas a minusculas