¿Cómo sustituir vocales acentuadas en documentos HTML con SED ?

0
1567

Hay ocaciones en que uno suele escribir documentos HTML en diferentes tipos de editores tales como:  kwrite, quanta, nano, pico o vi. Pero la cuestion no es la redacción de la misma, si no en la revisión de los diferentes caracteres especiales como las vocales acentuadas las “ñ”s, etc.

En virtud de que el documento deberá de estar bien editado en cuanto a la sintaxis y en sus correspondientes codigos html como lo son las vocales, es decir:
á > á
é > é
í > í
ó > ó
ú > ú
Á > Á

el sustituirlas a manos es un gran trabajo, para ello hecharemos mano del comando SED.

Por ejemplo si se requiere cambiar el archivo que contenga las vocales acentudas ejecutaremos el siguiente comando largo:

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

Pero aqui existe un pequeño problema, ya que al ejecutar el comando anterior daria como resultado: áaacute; éeacute; íiacute; óoacute; úuacute;

Aquie en vez de sustituir el texto, el problema radica en el caracter “&”,para solucionar este problema en bash el “&” 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

 

Ponerlo en un pequeño shell script seria

#!/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.sh”, 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.sh archivo.txt

Y nos creará un archivo de salida con nombre “archivo.txt”.

  • 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

Finalmente, se ha creado un shell script de manera muy general para todos los archivos con caracteres y/o vocales acentuadas.

Ejemplo:
acentos archivo1.html archivo2.html

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

Más informacion en : Advanced Bash-Scripting Guide.

LEAVE A REPLY

Please enter your comment!
Please enter your name here