Подстановка переменных в sed сценарий

Примечание: В Вашем случае лучшее должно было бы просто отбросить полномочия пользователя root для обновлений и запустить Ваши скрипты с Вашим apache пользователь:

 su apache -c "./update-script"

Иначе использовать chmod g+s /var/www. Новые файлы и подкаталоги, созданные в этом каталоге, совместно используют того же владельца/группу как родительский каталог по умолчанию. (Это распространяется рекурсивно.)

Согласно coreutils руководству это - расширение выхода GNU, которое не является портативным. Это, кажется, работает только на идентификатор группы, но я думаю, что должно быть достаточно иметь дело с этим общим видом проблемы. (Используя umask 002 когда запущение скрипта могло бы помочь также.)

4
05.04.2012, 20:09
2 ответа

Измените одинарные кавычки на двойные кавычки. И отбросьте кошку (UUoC):

sed "s:foobar:$MYSTRING:" myfile > myfile-individual

Из страницы справочника для удара:

   Enclosing characters in single quotes preserves the  literal  value  of
   each character within the quotes.  A single quote may not occur between
   single quotes, even when preceded by a backslash.

   Enclosing characters in double quotes preserves the  literal  value  of
   all  characters  within the quotes, with the exception of $, `, \, and,
   when history expansion is enabled, !.  The characters $  and  `  retain
   their  special meaning within double quotes.  The backslash retains its
   special meaning only when followed by one of the following  characters:
   $,  `,  ", \, or <newline>.  A double quote may be quoted within double
   quotes by preceding it with a backslash.  If enabled, history expansion
   will  be  performed  unless an !  appearing in double quotes is escaped
   using a backslash.  The backslash preceding the !  is not removed.
6
27.01.2020, 20:54
  • 1
    Спасибо. Я нашел что 's:foobar:' $MYSTRING'': будет также работать, но двойные кавычки делают код более четким. Быстрое продолжение: для sed действительно ли возможно занять место оперативный (не сохраняя в новый файл)? –  Calaf 05.04.2012, 20:29
  • 2
    Спасибо. Я нашел что 's:foobar:' $MYSTRING'': будет также работать, но двойные кавычки делают код более четким. Быстрое продолжение: для sed действительно ли возможно занять место оперативный (не сохраняя в новый файл)? –  Calaf 05.04.2012, 20:29
  • 3
    Да, посмотрите на -i опция в sed. –  Arcege 05.04.2012, 20:58
  • 4
    Вместо sed -i необходимо изучить ed также. sed -i разрывает связи и не является очень портативным, но если Вы не должны волноваться о также, затем это может быть прекрасным. –  jw013 05.04.2012, 21:35
  • 5
    @Calaf:.. относительно того, о чем Вы сказали 's:foobar:'$MYSTRING':' будет также работать.. Это не будет работать если $MYSTRING содержит последовательность пробела; который оболочка свернет в одиночный пробел... Однако 's:foobar:'"$MYSTRING"':' будет работать в этом случае. –  Peter.O 06.04.2012, 09:59
  • 6
    @Calaf:.. относительно того, о чем Вы сказали 's:foobar:'$MYSTRING':' будет также работать.. Это не будет работать если $MYSTRING содержит последовательность пробела; который оболочка свернет в одиночный пробел... Однако 's:foobar:'"$MYSTRING"':' будет работать в этом случае. –  Peter.O 06.04.2012, 09:59
sed -i 's|foobar|$MYSTRING' myfile-individual 

Это выполнит замену, а также запишет ее в файл

-1
27.01.2020, 20:54

Теги

Похожие вопросы