2011-08-11 9 views
6

Estoy tratando de escribir un script bash que tome algunas variables y luego busque/reemplace con una búsqueda de archivos dada usando grep para obtener la lista de archivos que tienen el string. Creo que el problema que estoy teniendo es que las variables se vean en sed. No estoy seguro de qué más podría ser.Script Bash utilizando sed con variables en un ciclo for?

if [ "$searchFiles" != "" -a "$oldString" != "" -a "$newString" != "" ]; then 
    echo -en "Searching for '$searchFiles' and replacing '$oldString' with '$newString'.\n" 
    for i in `grep $oldString $searchFiles |cut -d: -f1|uniq`; do 
     sed -i 's/${oldString}/${newString}/g' $i; 
    done 
    echo -en "Done.\n" 
else 
    usage 
fi 
+0

Usted necesita comillas dobles para la sustitución de variables en bash Creo - 'sed -i "s/$ {} oldString/$ {newString}/g "$ i;' – arunkumar

Respuesta

15

use comillas dobles para que el shell pueda sustituir las variables.

for i in `grep -l $oldString $searchFiles`; do 
    sed -i "s/${oldString}/${newString}/g" $i; 
done 

si la búsqueda o reemplazar cadena contienen caracteres especiales que necesita para escapar de ellos: Escape a string for a sed replace pattern

+0

Gracias que lo hizo y gracias por señalar un lugar para ayudar a escapar de la cadena. Esa fue mi siguiente tarea para trabajar. – LF4

4

Use comillas dobles por lo que las variables ambientales se expanden por la cáscara antes de que llama SED:

sed -i "s/${oldString}/${newString}/g" $i; 

Tenga cuidado: si bien oldString o newString contienen barras u otros caracteres especiales de expresiones regulares, serán interpretado como su significado especial, no como cadenas literales.

Cuestiones relacionadas