2012-02-08 83 views
0

我试图用一个shell脚本中的$PEAR_ROOT变量替换配置文件中{$pear_root}的实例。简单的BASH字符串替换

使用从here方法“的注记关于猛砸转义字符”下,我有:

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

我找回34:坏替代我认为这可能意味着这是不支持的。

这个问题似乎是使用s/find/replace/,因为我得到的错误是sedperl

什么是做到这一点的最简单的方法:

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

什么是你想设置ESC_PEAR_ROOT来代替PEAR_ROOT?你能给个例子吗? – 2012-02-08 22:35:16

+0

您还没有在表达式的第二部分中跳过$ - 是否会改变这些内容? – John3136 2012-02-08 22:37:11

+0

@evil otto:我认为ESC_PEAR_ROOT最终会以\ /之前的每一个斜杠结尾。我需要这一条语句,但我还需要原始的PEAR_ROOT以备后用。所以如果我逃脱PEAR_ROOT,我将无法在稍后使用它作为路径。 – Eli 2012-02-08 22:43:45

回答

2

好的,解决了。

的问题是:

此:

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

本来应该是这样的:

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

这是什么导致我的 “坏替代” 的错误。

此外,我意识到我不需要逃避,因为我可以使用不同的分隔符,所以我甚至不需要这条线。

最终结果最终为:

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

这有点傻,但我注意到你的表达式结尾和你想要应用它的文件名之间缺少一个空格。

/tmp $ sed -e 's/{$pear_root}/'"$PATH"'/' test 
/tmp $ sed -e 's/{$pear_root}/'"$PATH"'/'test 
sed: bad option in substitution expression 
+0

是的,很好。我弄明白了,但额外的“$”是杀死它的原因。 – Eli 2012-02-08 23:00:33