Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Unix / Linux (http://www.forosdelweb.com/f41/)
-   -   Sustituir vocales acentuadas en documento HTML (http://www.forosdelweb.com/f41/sustituir-vocales-acentuadas-documento-html-311092/)

-Defero- 25/06/2005 16:12

Sustituir vocales acentuadas en documento HTML
 
Suelo escribir mis documentos HTML directamente en un editor de texto, a veces Kwrite, a veces Quanta. La cuestión es que después de escribir, tengo que revisar si se me ha escapado alguna vocal acentuada, para sustituirla por su correspondiente código. Es decir:

á > á
é > é
í > í
ó > ó
ú > ú
Á > Á
...

La cuestión es que hacer esa sustitución a mano, además de algún que otro carácter más (ñ > ñ), resulta bastante tedioso, así que me he puesto a buscar un modo de realizar esa sustitución de manera automatizada. Y creo haberlo encontrado, y se llama "sed".

Bien, guay, genial... vamos a hacer una prueba. Creo un documento de nombre acentos.txt con el siguiente texto: á é í ó ú

Y ejecuto lo siguiente en la consola:

cat acentos.txt | sed -e 's/á/á/' -e 's/é/é/' -e 's/í/í/' -e 's/ó/ó/' -e 's/ú/ú/' > acentos2.txt

Lo que me da este resultado: áaacute; éeacute; íiacute; óoacute; úuacute;

En vez de sustituir el texto, lo que ha hecho ha sido añadirlo (más o menos). Imagino que el problema radica en el caracter "&", pero no tengo ni idea de cómo solventarlo... alguien me puede ayudar? La verdad es que me ahorraría mucho tiempo corregir mis documentos ejecutando una sola línea en la consola, en vez de tener que andar sustituyendo mediante la opción de "reemplazar" del editor de textos.

-Defero- 25/06/2005 16:25

Juaz! Google es Diox!! Y yo un mal creyente!! Perdonad que no ponga el enlace, porque he perdido la búsqueda... pero me he quedado con la solución. :D

En bash "&" es un caracter especial. Para que se ejecute sin tener en cuenta esa "especialidad", basta con precederlo con una barra oblicua "\&". Además, en la anterior pseudo-solución se me había olvidado añadir "g" a cada sustitución. En fin, la solución definitiva es ésta:

cat acentos.txt | 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' > acentos2.txt

Espero que a alguien le sea de ayuda. ;-)

-Defero- 25/06/2005 16:29

Por cierto, a alguien se le ocurre cómo sería un script para poder automatizar la tarea, sin tener que andar copiando y pegando el código, y luego sustituyendo el nombre del archivo, cada vez que quisiera hacer el cambio? Es que el bash-scripting aún me queda muy holgado, que yo soy de letras. :)

-Defero- 25/06/2005 16:58

Wow, wow, wow!! Esto es súper-mega-archi-divertido!! He estado echando un vistazo a este manual de programación en shell, y aunque me cuesta mucho entender algunas cosas, he podido escribir MI PRIMER SCRIPT!!!

Tomen nota, señores y señoras:

#!/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

Guardamos el archivo como "acentos", nos aseguramos de que es ejecutable, y el uso es muy sencillo: si el archivo en el que queremos hacer la sustitución se llama "archivo.txt", tecleamos lo siguiente:

acentos archivo.txt

Y nos creará un archivo de nombre "archivo.txt.txt" (es una chapuza, pero qué quieres... es mi primer script) con los caracteres corregidos. :-)

-Defero- 25/06/2005 19:06

Una variante del script: ahora si tecleamos "acentos archivo.html", primero creará una copia de seguridad del archivo de nombre "archivo.html.bak", luego realizará los cambios en dicho archivo, y guardará los cambios de nuevo en el archivo "archivo.html". De esta manera el archivo modificado resultante tendrá el mismo nombre que el original (con lo cual no hay que tomarse la molestia de andar cambiando la extensión al archivo), y se habrá creado un archivo de respaldo de extensión .bak, por si acaso. Ah, de paso también he añadido unos cuantos caracteres especiales más. El código es el siguiente:

#!/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

Por cierto, se me olvidaba comentar que moviendo el ejecutable al directorio /usr/bin tendremos acceso al mismo desde cualquier punto de la estructura de directorios y desde cualquier cuenta de usuario. ;-)

Tengo varias ideas para añadirle funcionalidad al script, 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. :-)

Koveart 26/06/2005 17:24

Esto es un monólogo en toda su expresión. Creo que será muy útil para la gente que poco onoce de scripting en shell que tanto trabajo no spuede reducir a los administradores de sistemas operativos como unix. Graacias por compartir el conocimiento Defero.tk.

Saludos

AleSanchez 26/06/2005 19:42

Perdon Defero.tk si me meto en tu monologo y en tu script, a modo de contribucion, aca va el script modificado para leer los archivos pasados como parametro desde la linea de comandos.

Falta de las ideas de Defero.tk:
Cita:

Iniciado por Defero.tk
(...)poder utilizar comodines para modificar (por ejemplo) todos los archivos que tengan extensión HTML (acentos *.html);(...)

Creditos a esta Web: Advanced Bash-Scripting Guide
Es muy buena pero en ingles.

Saludos.

---------------------------------------
Ejemplo:

acentos archivo1.html archivo2.html


Código:

#!/bin/bash
if [ "--help" = "$1" ] || [ "0" = "$#" ]
then
    echo
    echo "Uso:"
    echo "      acentos < archivo1 archivo2 ... archivoN >"
    echo
    exit 0
fi

until [ -z "$1" ]
do
    archivo="$1"
    if [ -f $archivo ]
    then
        cp $archivo ${archivo}.bak
        cat ${archivo}.bak | sed -e 's/á/\&aacute;/g' -e 's/é/\&eacute;/g' -e 's/í/\&iacute;/g' -e 's/ó/\&oacute;/g' -e 's/ú/\&uacute;/g' -e 's/ñ/\&ntilde;/g' -e 's/Á/\&Aacute;/g' -e 's/É/\&Eacute;/g' -e 's/Í/\&Iacute;/g' -e 's/Ó/\&Oacute;/g' -e 's/Ú/\&Uacute;/g' -e 's/Ñ/\&Ntilde;/g' -e 's/©/\&copy;/g' -e 's/¡/\&iexcl;/g' -e 's/§/\&sect;/g' -e 's/ª/\&ordf;/g' -e 's/«/\&laquo;/g' -e 's/®/\&reg;/g'-e 's/±/\&plusmn;/g' -e 's/²/\&sup2;/g' -e 's/³/\&sup3;/g' -e 's/¶/\&para;/g' -e 's/º/\&ordm;/g' -e 's/»/\&raquo;/g' -e 's/¿/\&iquest;/g' -e 's/Æ/\&AElig;/g' -e 's/Ç/\&Ccedil;/g' -e 's/æ/\&aelig;/g' -e 's/ç/\&ccedil;/g' -e 's/Ü/\&Uuml;/g' -e 's/ü/\&uuml;/g' > $archivo
    else
        if [ -d $archivo ]
        then
            echo "$archivo: Es un directorio"
        else
            echo "$archivo: Archivo no existente"
        fi
    fi
    shift
done



La zona horaria es GMT -6. Ahora son las 07:22.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2024, Jelsoft Enterprises Ltd.