Сценарий Bash, использующий sed с переменными в цикле for? - PullRequest
11 голосов
/ 12 августа 2011

Я пытаюсь написать 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 ]

21 голосов
/ 12 августа 2011

используйте двойные кавычки, чтобы оболочка могла заменять переменные.

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

, если в строке поиска или замены содержатся специальные символы, вам необходимо их экранировать: Выход из строки для шаблона замены sed

5 голосов
/ 12 августа 2011

Используйте двойные кавычки, чтобы переменные окружения расширялись оболочкой перед вызовом sed:

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

Будьте осторожны: если либо oldString, либо newString содержат косую черту или другие специальные символы регулярного выражения, онибудет интерпретироваться как их особое значение, а не как буквальные строки.

...