web-dev-qa-db-fra.com

Script bash utilisant sed avec des variables dans une boucle for?

J'essaie d'écrire un script bash qui prend quelques variables, puis effectue une recherche/remplacement avec une recherche de fichier donnée en utilisant grep pour obtenir la liste des fichiers qui ont la chaîne. Je pense que le problème que j'ai est de voir les variables dans sed.Je ne sais pas trop ce que cela pourrait être.

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

utilisez des guillemets doubles pour que le Shell puisse remplacer des variables.

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

si votre chaîne de recherche ou de remplacement contient des caractères spéciaux, vous devez les échapper: Échapper une chaîne pour un modèle de remplacement sed

23
Karoly Horvath

Utilisez des guillemets doubles pour que les variables d'environnement soient développées par le Shell avant d'appeler sed:

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

Attention: si oldString ou newString contiennent des barres obliques ou d'autres caractères spéciaux de l'expression rationnelle, ils seront interprétés comme leur signification spéciale, et non comme des chaînes littérales.

5