Bash script using sed with variables in a for loop?

78,789

Solution 1

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

Solution 2

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.

Share:
78,789
krizzo
Author by

krizzo

Updated on July 19, 2022

Comments

  • krizzo
    krizzo almost 2 years

    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