Простая замена строки BASH - PullRequest
       0

Простая замена строки BASH

0 голосов
/ 09 февраля 2012

Я пытаюсь заменить экземпляры {$pear_root} в файле конфигурации на переменную $PEAR_ROOT в сценарии оболочки.

Используя метод из здесь в разделе «Замечание о персонаже Bash Escape» у меня есть:

ESC_PEAR_ROOT="${PEAR_ROOT//\//\\/}"
sed -i "s/{\$pear_root}/${ESC_PEAR_ROOT}/"../.serverconfig/test.txt

Я возвращаюсь 34: Плохая замена , что, я думаю, может означать, что это не поддерживается.

Проблема, похоже, заключается в использовании s/find/replace/, поскольку я получаю ту же ошибку при выполнении этого с sed или с perl.

Какой самый простой способ сделать это:

APP_ROOT=$(php ./scripts/get_realpath.php '../')
PEAR_ROOT="$APP_ROOT/pear"
ESC_PEAR_ROOT="${PEAR_ROOT//\//\\/}"
sed -e "s/{\$pear_root}/${ESC_PEAR_ROOT}/"../.serverconfig/test.txt

И в итоге все экземпляры {$pear_root} в test.txt заменяются на путь из PEAR_ROOT?

Я не привязан к этому методу - подойдет что-нибудь надежное.

Ответы [ 2 ]

3 голосов
/ 09 февраля 2012

Это немного глупо, но я замечаю, что вам не хватает пробела между концом вашего выражения и именем файла, к которому вы хотите его применить.

/tmp $ sed -e 's/{$pear_root}/'"$PATH"'/' test
/tmp $ sed -e 's/{$pear_root}/'"$PATH"'/'test 
sed: bad option in substitution expression
2 голосов
/ 09 февраля 2012

ОК, решил.

Проблема была:

Это:

ESC_PEAR_ROOT="${PEAR_ROOT//\//\\/}"

Должно было быть так:

ESC_PEAR_ROOT="{PEAR_ROOT//\//\\/}"

Именно это и стало причиной моей ошибки "плохой замены".

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

Окончательный результат закончился как:

APP_ROOT=$(php ./scripts/get_realpath.php '../')
PEAR_ROOT="$APP_ROOT/pear"
sed -i "s#{\$pear_root}#${PEAR_ROOT}#g" ../.serverconfig/test.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...