HTML y vocales acentuadas: mi primer script

Estaba yo ayer retocando una cuasi-web que monté casi de casualidad, a base de HTML en Quanta (otras veces uso BlueFish, aunque la mayoría de las veces prefiero usar Kwrite), y como de costumbre, al visualizarla en el navegador, me encontré con el siguiente problema: las palabras acentuadas se ven mal. Y es que en el HTML, como la mayoría ya sabréis, para escribir “á” hay que poner “á“, y por mucho que lo intento, según escribo se me olvida utilizar esos códigos tan poco humanos. Así que me dispongo a hacer el cambio en todo el documento… lo cual supone sustituir todas las “á” por “á“, “é” por “é“… así las cinco vocales, tanto en mayúscula como en minúscula; y también, cómo no, la eñe, en mayúscula y minúscula también. Es la parte que más odio. ¿No existirá en GNU/Linux alguna herramienta capaz de hacer el cambio por mí? Pues sí, existe, y se llama sed. Su uso es a priori bastante simple: si en un archivo de nombre “archivo.txt” queremos sustituir todas las “a” por “e”, tecleamos lo siguiente en la consola:

cat archivo.txt | sed -e ‘s/a/e/g’ > archivo2.txt

Así que para cambiar las “á” por “á” en un archivo HTML, debería bastar con lo siguiente:

cat archivo.html | sed -e ‘s/á/á/g’ > archivo2.html

Pues nooooo señor… porque resulta que “&” es un caracter especial que sed [corrección] interpeta a su modo, y el resultado es desastroso. Pregunté en Forosdelweb (dudé si preguntarlo en Barrapunto), pero al final fue Google quien me dio la solución: preceder el caracter “&” por una barra oblícua (\), para que sea leído tal cual. El código queda así:

cat archivo.html | sed -e ‘s/á/\á/g’ > archivo2.html

Tras comprobar que el método funciona, vamos a cambiar en una sola línea todas las vocales acentuadas y las eñes (mayúsculas y minúsculas) por su correspondiente código. Tal que así:

cat archivo.html | sed -e ‘s/á/\á/g’ -e ‘s/é/\é/g’ -e ‘s/í/\í/g’ -e ‘s/ó/\ó/g’ -e ‘s/ú/\ú/g’ -e ‘s/ñ/\ñ/g’ -e ‘s/Á/\Á/g’ -e ‘s/É/\É/g’ -e ‘s/Í/\Í/g’ -e ‘s/Ó/\Ó/g’ -e ‘s/Ú/\Ú/g’ -e ‘s/Ñ/\Ñ/g’ > archivo2.html

Y funciona! Vaya que si funciona! Esto me va a ahorrar algo de trabajo a la hora de perder el tiempo escribiendo HTML. Aunque es un engorro eso de tener que andar usando una cadena tan larga… tendría que tenerla siempre a mano apuntada en algún lado, y queda demasiado cutre… ¿y si intento crear un script que automatice la tarea? Vale que soy de letras y me estoy metiendo en un campo que no me corresponde… pero no hago daño a nadie. Venga, el mundo es para los valientes! Encuentro en Google un tutorial de programación en shell, y me pongo a leerlo… hmmm… he de admitirlo, es un pelín lioso para mí, yo soy bastante más elemental. Pero al final consigo teclear un script sencillito que más o menos hace lo que quiero:

#!/bin/bash
archivo=$1
cat $archivo | sed -e ‘s/á/\á/g’ -e ‘s/é/\é/g’ -e ‘s/í/\í/g’ -e ‘s/ó/\ó/g’ -e ‘s/ú/\ú/g’ -e ‘s/ñ/\ñ/g’ -e ‘s/Á/\Á/g’ -e ‘s/É/\É/g’ -e ‘s/Í/\Í/g’ -e ‘s/Ó/\Ó/g’ -e ‘s/Ú/\Ú/g’ -e ‘s/Ñ/\Ñ/g’ > ${archivo}.txt

Lo guardo con el nombre acentos, le doy permisos de ejecución, lo llevo a /usr/bin, y listo, ya tengo mi script totalmente operativo. El funcionamiento es un tanto rudimentario, pero resulta funcional: en la consola tecleas acentos archivo.html, y te crea un nuevo archivo de nombre archivo.html.txt corregido (luego habrá que cambiar la extensión, tras comprobar que es correcto). Permitidme que me sienta orgulloso de mi modesta creación. Es poco más que un “Hola, mundo”, pero oye, es de cierta utilidad. A mí me va a ahorrar tiempo y tedio. Aunque… no me termina de convencer. Voy a hacerle un par de cambios: en vez de crear un archivo de extensión .txt con el resultado, voy a hacer que primero cree una copia de respaldo con extensión .bak, y luego a partir del mismo haga las correcciones y las guarde con el nombre del archivo original, sobreescribiéndolo. Además, voy a añadir más correcciones, para que no sólo me corrija los acentos y las eñes, sino también otros caracteres especiales (no todos, porque estropearía el código HTML del documento). El resultado es éste:

#!/bin/bash
archivo=$1
cp $archivo ${archivo}.bak && cat ${archivo}.bak | sed -e ‘s/á/\á/g’ -e ‘s/é/\é/g’ -e ‘s/í/\í/g’ -e ‘s/ó/\ó/g’ -e ‘s/ú/\ú/g’ -e ‘s/ñ/\ñ/g’ -e ‘s/Á/\Á/g’ -e ‘s/É/\É/g’ -e ‘s/Í/\Í/g’ -e ‘s/Ó/\Ó/g’ -e ‘s/Ú/\Ú/g’ -e ‘s/Ñ/\Ñ/g’ -e ‘s/©/\©/g’ -e ‘s/¡/\¡/g’ -e ‘s/§/\§/g’ -e ‘s/ª/\ª/g’ -e ‘s/«/\«/g’ -e ‘s/®/\®/g’ -e ‘s/±/\±/g’ -e ‘s/²/\²/g’ -e ‘s/³/\³/g’ -e ‘s/¶/\¶/g’ -e ‘s/º/\º/g’ -e ‘s/»/\»/g’ -e ‘s/¿/\¿/g’ -e ‘s/Æ/\Æ/g’ -e ‘s/Ç/\Ç/g’ -e ‘s/æ/\æ/g’ -e ‘s/ç/\ç/g’ -e ‘s/Ü/\Ü/g’ -e ‘s/ü/\ü/g’ > $archivo

El modo de uso sigue siendo el mismo, pero no el resultado: en la consola vuelves a teclear acentos archivo.html, y crea una copia de seguridad de nombre archivo.html.bak, para luego modificarlo y guardarlo como archivo.html. De esta manera no hace falta andar renombrando archivos para poder usarlos, y por si acaso tomamos la precaución de guardar una copia del original.

Aunque el script es perfectamente usable, tengo varias ideas para añadirle funcionalidad, como por ejemplo poder procesar varios archivos escribiendo una sola línea (acentos archivo1.html archivo2.html archivo3.html) en vez de tener que modificarlos uno a uno; poder utilizar comodines para modificar (por ejemplo) todos los archivos que tengan extensión HTML (acentos *.html); añadir una explicación del funcionamiento del script (acentos –help), mensajes de error para cuando no se encuentra el archivo indicado o no se indica nombre de archivo… pero para eso ya habrá tiempo. De momento que el script funcione, aunque sea muy rudimentario, para mí ya es un gran logro.

Por cierto, esto es demasiado simple como para poder poseer ningún tipo de copyright sobre el mismo y poder licenciarlo bajo la GPL, ¿verdad? Es absurdo que os diga que podéis utilizarlo, modificarlo, distribuirlo y demás como os dé la santísima gana siempre que otorguéis las mismas libertades a quien lo reciba de vuestra mano. Espero que al menos a alguien le sea de ayuda. 😉

Publicado en Barrapunto