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.