web-dev-qa-db-ja.com

forループで変数付きのsedを使用するBashスクリプト?

いくつかの変数を取り、grepを使用して特定のファイル検索で検索/置換を行い、文字列を含むファイルのリストを取得するbashスクリプトを記述しようとしています。私が抱えている問題は、変数が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
12
LF4

シェルが変数を置換できるように二重引用符を使用します。

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

検索または置換文字列に特殊文字が含まれている場合は、それらをエスケープする必要があります。 sed置換パターンの文字列をエスケープする

23
Karoly Horvath

シェルがsedを呼び出す前に環境変数が展開されるように、二重引用符を使用します。

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

注意してください:oldStringまたはnewStringにスラッシュまたはその他の正規表現の特殊文字が含まれている場合、それらはリテラル文字列としてではなく、特別な意味として解釈されます。