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/á/\á/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
else
if [ -d $archivo ]
then
echo "$archivo: Es un directorio"
else
echo "$archivo: Archivo no existente"
fi
fi
shift
doneMás informacion en : Advanced Bash-Scripting Guide.