2010-12-14 50 views
15

Estoy tratando de encontrar y reemplazar una cadena en una carpeta de archivos.buscar y reemplazar cadena en un archivo

¿Alguien podría ayudarme?

Mi script es el siguiente:

#!/bin/bash 
OLD="This is a" 
NEW="I am a" 
DPATH="/home/user/test/*.txt" 
BPATH="/home/user/test/backup/foo" 
[ ! -d $BPATH ] && mkdir -p $BPATH || : 
for f in $DPATH 
do 
    if [ -f $f -a -r $f ]; then 
    /bin/cp -f $f $BPATH 
    sed "s/$OLD/$NEW/g" "$f" 
    else 
    echo "Error: Cannot read $f" 
    fi 
done 

Ahora bien, esto parece encontrar la cadena 'Esta es una' y reemplaza con 'Soy un', pero esto sólo se imprime a la pantalla.

Lo necesito para reemplazarlo en los archivos.

Gracias

Respuesta

26

Use la opción de sed-i para hacer los cambios en su lugar:

sed -i "s/$OLD/$NEW/g" "$f" 
    ^^ 
+0

Funcionó muy bien! Sabía que me había perdido algo. Gracias – terrid25

+0

Ok, ¿hay alguna manera fácil de modificar mi script de shell, para que se compruebe en las subcarpetas?/home/usuario/prueba/xyz? – terrid25

+0

#! Bin/bash OLD = "Esto es un" NUEVO = "Soy un" BPATH = "/ home/user/backup/foo" buscar. -name '* .shtml' -type f | mientras se lee el nombre de archivo hacer /bin/cp -f $ archivo $ Bpath sed -i "s/$ VIEJO/NUEVO $/g" $ archivo hecho – terrid25

2

la salida va a la pantalla (stdout) por lo siguiente:

sed "s/$OLD/$NEW/g" "$f" 

Trate de volver a dirigir a un archivo (los siguientes redirecciones a un nuevo archivo y luego se le cambia el nombre para sobrescribir el original archivo):

sed "s/$OLD/$NEW/g" "$f" > "$f.new" && mv "$f.new" "$f" 
+0

Eso crea un archivo .text.new y el archivo original, example.txt i s sobrescrito y está en blanco. ¿Alguna idea de por qué? – terrid25

+0

@ user390426: Podría ser porque aix no citó las variables '" $ f.new "'(dos lugares) y' "$ f" '. Además, el 'mv' no debe ser incondicional. En cambio, debería ser 'sed ... && mv ...'. –

+0

@Dennis Gracias por las sugerencias. Edité la publicación. – NPE

0

este es un fragmento de código que utilizo, que elimina toda la materia entre la APA y OAPE (a través de múltiples líneas, incluyendo la eliminación de la APA, OAPE) i n todos los archivos por debajo de directorio actual, excluyen el directorio .svn

find . \! -path '*.svn*' -type f -exec sed -i -n '1h;1!H;${;g;s/APA[ \t\r\n]*BEPA//g;p}' {} \; 
0

mira esto

http://cs.boisestate.edu/~amit/teaching/handouts/cs-unix/node130.html

########################################################## 
\#!/bin/sh 

\# sed/changeword 

prog=`basename $0` 

case $# in 
0|1) echo 'Usage:' $prog '<old string> <new string>'; exit 1;; 
esac 

old=$1 
new=$2 
for f in * 
do 
     if test "$f" != "$prog" 

     then 
      if test -f "$f" 
      then 
       sed "s/$old/$new/g" $f > $f.new 
       mv $f $f.orig 
       mv $f.new $f 
       echo $f done 
      fi 
     fi 
done 

##############################################################