16

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
1
  • 1
    You need double quotes for variable substitution in bash I think - sed -i "s/${oldString}/${newString}/g" $i; Commented Aug 11, 2011 at 22:50

2 Answers 2

34

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

Sign up to request clarification or add additional context in comments.

Comments

8

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.