简单的BASH字符串替换

时间:2012-02-08 22:31:43

标签: string bash shell

我正在尝试用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的路径?

我不喜欢这种方法 - 任何可靠的方法都可以。

2 个答案:

答案 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