在for循环中使用带有变量的sed的Bash脚本?

时间:2011-08-11 22:46:54

标签: bash variables scripting sed

我正在尝试编写一个带有一些变量的bash脚本,然后使用grep对给定的文件搜索进行查找/替换,以获取具有该字符串的文件列表。我认为我遇到的问题是在sed中看到变量我不知道它可能是什么。

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

2 个答案:

答案 0 :(得分:21)

使用双引号,以便shell可以替换变量。

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

如果您的搜索或替换字符串包含特殊字符,则需要将其转义:Escape a string for a sed replace pattern

答案 1 :(得分:5)

使用双引号,以便在调用sed之前由shell扩展环境变量:

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

警惕:如果oldStringnewString包含斜杠或其他正则表达式特殊字符,它们将被解释为它们的特殊含义,而不是文字字符串。