Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bash script using sed with variables in a for loop?

I'm trying to write a bash script that takes a few variables and then does a find/replace with a given file search using grep to get the list of files that have the string. I think the issue I'm having is having the variables be seen in sed I'm not sure what else it might be.

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
like image 494
krizzo Avatar asked Aug 11 '11 22:08

krizzo


2 Answers

use double quotes so the shell can substitute variables.

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

if your search or replace string contains special characters you need to escape them: Escape a string for a sed replace pattern

like image 70
Karoly Horvath Avatar answered Sep 22 '22 04:09

Karoly Horvath


Use double quotes so the environmental variables are expanded by the shell before it calls sed:

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

Be wary: If either oldString or newString contain slashes or other regexp special characters, they will be interpreted as their special meaning, not as literal strings.

like image 29
Conspicuous Compiler Avatar answered Sep 22 '22 04:09

Conspicuous Compiler