PreguntasLinux

Versión Completa: SED, Reemplazar strings en archivos
Actualmente estas viendo una versión simplificada de nuestro contenido. Para ver la versión completa en el formato correcto, dale click aquí
hola 1-wink
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 1-wink

gracias
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.

saludos....
Hola 1-wink

Ta muy bueno 1-wink
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.

muchas gracias 1-wink
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

hola 1-wink
El archivo a.txt tiene este texto:
queridos tio\\/as

Cuando ejecuto el sh, tanto el a.txt como a.txt.bak son igual sin ningun cambio.

Cuando ejecuto sed me tira
ututo-xs sh.org # sed "s_"queridos tio\\/as"_"si"_g" < a.txt
sed: -e expression #1, char 10: Unterminated `s' command

Como podemos hackear eso 1-wink
Y Gracias 1-wink
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.
como ?

angelm Escribió:
hola 1-wink
El archivo a.txt tiene este texto:
queridos tio\\/as

Cuando ejecuto el sh, tanto el a.txt como a.txt.bak son igual sin ningun cambio.

Cuando ejecuto sed me tira
ututo-xs sh.org # sed "s_"queridos tio\\/as"_"si"_g" < a.txt
sed: -e expression #1, char 10: Unterminated `s' command

Como podemos hackear eso 1-wink
Y Gracias 1-wink


No entendi lo que queres hacer... a si  que muestro te algunas posibilidades que se me ocurren

Código:
german@Debian:~$ cat a.txt
queridos tio\\/as

german@Debian:~$  sed  's/\\//g'  a.txt  #le borramos las \
queridos tio/as

german@Debian:~$  sed  's/\\//g'  a.txt |sed -e 's/\///g'      ·le borramos las \ y las /
queridos tioas

german@Debian:~$  sed   's/\\//'  a.txt  # borramos una sola \
queridos tio\/as

german@Debian:~$  sed   's/\///'  a.txt  # borramos solo la /
queridos tio\\as

Hola 1-wink
un soft que reemplaze texto en archivos.

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 1-wink

angelm Escribió:
como ?


esconde preserva /

sed "s/\//666/g"


restablece /

sed "s/666/\//g"

Hola 1-wink
Eso yo ya lo se.
La idea es para user que no saben.
fijate el post anterior para tener una mejor vision del problema.

gracias 1-wink
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.
Páginas: 1 2
URLs de Referencia