我正在尝试用shell脚本中的{$pear_root}
变量替换配置文件中的$PEAR_ROOT
实例。
使用“关于Bash Escape字符的注释”中here的方法,我有:
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
的路径?
我不喜欢这种方法 - 任何可靠的方法都可以。
答案 0 :(得分:3)
这有点傻,但我注意到你在表达式的结尾和你想要应用它的文件的名称之间缺少一个空格。
/tmp $ sed -e 's/{$pear_root}/'"$PATH"'/' test
/tmp $ sed -e 's/{$pear_root}/'"$PATH"'/'test
sed: bad option in substitution expression
答案 1 :(得分:2)
好的,解决了。
问题是:
此:
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