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

LF4*_*LF4 11 variables bash 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
Run Code Online (Sandbox Code Playgroud)

Kar*_*ath 23

使用双引号,所以shell可以替换变量.

for i in `grep -l $oldString $searchFiles`; do
  sed -i "s/${oldString}/${newString}/g" $i;
done
Run Code Online (Sandbox Code Playgroud)

如果您的搜索或替换字符串包含特殊字符,则需要转义它们:转义字符串以获取sed替换模式


Con*_*ler 5

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

  sed -i "s/${oldString}/${newString}/g" $i;
Run Code Online (Sandbox Code Playgroud)

警惕:如果有一个oldStringnewString包含斜线或其他正则表达式的特殊字符,它们将被解释为它们的特殊含义,不为文字字符串.