hola
estoy creqndo un scrips para reeemplazar texto en archivos.
mi problema es como tratar una cadena de texto y que se la trate como tal Ej
buscar "hola/*sipi" donde /* son letras a buscar y no representan expresion regular
esto es muy importante para evitar tener que reescribir una compleja expresion cada ve que algun usuario especifique como busqueda carateres que son parte de expresiones regulares
hola angelm, veo que estas incursando en bash, me alegro.... antes que nada, para poner una / como si fuera parte del texto, al igual que todos los caracteres especiales que son utilizados tb en el lenguaje para otras cosas (como "), tenes que ponerle adelante un \ (al igual que en todos los lenguajes)....
quedaría así "blanco\/negro", así se saltea el operador /..... saludos.
si usas awk, podes hacer algo como:
VARIABLE=$(awk '/{texto a buscar}/ {print $3}' url)
en este caso awk busca en un archivo <url>, y te devuelve la tercera palabra de todas las lineas con coincidencia que encuentre, donde podes modificar cosas como el $3, a $2 o lo que desees, si varias el número a "n" te devuelve la palabra numero "n" de las líneas encontradas.
Ta muy bueno
Pero supongamos que la cadena a buscar de alamcene $cadena, y un ususario que no conoce nada de exprsiones regulares ni casa una de \/, \*, etc
como declara que la cadena es solo texto en sed ej
echo "Buscar palabra"; read cadena
echo "Reemplazar po"; read remplaza
echo "en archivo"; read files
sed s/$cadena/$remplaza/g $file
El error de esta sentencia seria que si el usuario busca "querido/a" sed mal-interpreta /a.
ahora esta más claro lo que pedis, te dejo esto, un regalito del foro:
Código:
#
# Script: Reemplace Text Files.
# Descripcion: Reemplaza todas las ocurrencias de una palabra dentro de un archivo.
# Version: 0.01.
#
#!/bin/bash
function check_data() {
if [ -f "$1" ]; then
echo -e "File\t[FOUND]"
else
echo -e "\nERROR: File do not exist or not been correctly specified... (use -h (| --help) for help)\n"
exit
fi
if [ "$2" != "" ]; then
echo -e "Text to Reemplace\t[Ok]"
else
echo -e "\nERROR: Text to reemplace not been correctly specified... (use -h (| --help) for help)\n"
exit
fi
if [ "$3" != "" ]; then
echo -e "Text\t[Ok]"
else
echo -e "\nERROR: Text not been correctly specified... (use -h (| --help) for help)\n"
exit
fi
reemplace_text $1 $2 $3
}
function reemplace_text() {
cp $1 $1.bak
if [ -f "$1.bak" ]; then
echo -e "Backuping...\t[Ok]"
else
echo -e "\nERROR: Backup file cannot be created... (Contact Admin)\n"
exit
fi
sed "s_"$3"_"$2"_g" < $1 > $1.tmp
cp $1.tmp $1
rm $1.tmp
echo -e "Remplace Complete...\t[Ok]\n\n"
}
while [ "$1" != "" ]; do
case $1 in
-f | --cfg ) shift
FILENAME=$1
;;
-r | --remp ) shift
TREEMPLACE=$1
;;
-t | --text ) shift
TEXT=$1
;;
-h | --help ) shift
HELP="OK"
;;
* ) echo "ERROR: Unrecognized Option. (use -h (| --help) for help)"
exit
esac
shift
done
if [ "$HELP" != "OK" ]; then
echo -e "\n"
check_data $FILENAME $TREEMPLACE $TEXT
else
echo -e "\n---------------------------------------------------------------------------"
echo "Reemplace Text Files (v0.01) By warptrosse"
echo "---------------------------------------------------------------------------"
echo -e "\nUse reemplace_words_files.sh -f (| --file) <filename> -r (| --remp) <text_to_remplace> -t (| --text) <text>"
exit
fi
La primera que se me cruza es: antes ejecutar la conversión efectiva, hacer una auxiliar previa que cambie los caracteres comflictivos por otros y al final restablecerlos por los originales.
echo "file"; $1
echo "texto a rempl"; $3
echo "por "; $2
sed "s_"$3"_"$2"_g" < $1
Pero sed lee $3, $2 como expresiones regulares no como texto bruto.
Las personas que escriben los textos no saben de expresiones regulares, por eso si quieren remplazar queridos tio/as desconocen de queridos\ tio\/tas.
Se entiende
06-26-2006 03:05 PM
p_eter
Chaos Manager
Mensajes: 4,168
Grupo: Administrador
Registro en: Jun 2005
Estado:
En Línea Reputación: 12
No me explique:
a eso no lo hace el usuario, lo hace tu script. El usuario no tiene porque enterarse, ok?
Lo que quieres hacer (el usuario o quien sea ) va en medio.