Foros del Web » Administración de Sistemas » Unix / Linux »

Sustituir vocales acentuadas en documento HTML

Estas en el tema de Sustituir vocales acentuadas en documento HTML en el foro de Unix / Linux en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 25/06/2005, 16:12
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
Pregunta 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.
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable
  #2 (permalink)  
Antiguo 25/06/2005, 16:25
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
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.
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable
  #3 (permalink)  
Antiguo 25/06/2005, 16:29
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
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. :)
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable
  #4 (permalink)  
Antiguo 25/06/2005, 16:58
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
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.
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable
  #5 (permalink)  
Antiguo 25/06/2005, 19:06
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
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.
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable

Última edición por -Defero-; 25/06/2005 a las 19:24
  #6 (permalink)  
Antiguo 26/06/2005, 17:24
Avatar de Koveart
Colaborador
 
Fecha de Ingreso: julio-2002
Ubicación: Colombia
Mensajes: 4.407
Antigüedad: 21 años, 9 meses
Puntos: 29
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
__________________
“Los soñadores no existen, se lo dice un soñador que ha tenido el privilegio de ver realidades que ni siquiera fue capaz de soñar”
  #7 (permalink)  
Antiguo 26/06/2005, 19:42
Avatar de AleSanchez
Colaborador
 
Fecha de Ingreso: septiembre-2004
Ubicación: Buenos Aires, Argentina
Mensajes: 3.692
Antigüedad: 19 años, 7 meses
Puntos: 47
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
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 12:18.