简单的 BASH 字符串更换

Simple BASH string replacement

提问人:Eli 提问时间:2/9/2012 最后编辑:jcolladoEli 更新时间:2/9/2012 访问量:2625

问:

我正在尝试将配置文件中的实例替换为shell脚本中的变量。{$pear_root}$PEAR_ROOT

使用关于 Bash 转义字符的说明”下的方法,我有:

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

并最终将 in 的所有实例替换为 ?{$pear_root}test.txtPEAR_ROOT

我不依附于这种方法 - 任何可靠的方法都可以。

字符串 bash shell

评论

0赞 evil otto 2/9/2012
你想把ESC_PEAR_ROOT设置为什么而不是PEAR_ROOT?你能举个例子吗?
0赞 John3136 2/9/2012
你还没有在表达式的第二部分转义 $ - 这会改变事情吗?
0赞 Eli 2/9/2012
@evil otto:我认为ESC_PEAR_ROOT最终会以 \/ 结束,每个斜杠都过去在哪里。我需要这个语句,但我也需要原始PEAR_ROOT以供以后使用。因此,如果我逃脱PEAR_ROOT,我以后将无法将其用作路径。
0赞 Eli 2/9/2012
@John3136:我想我希望它得到扩展。如果我转义$,那么文件最终将包含$PEAR_ROOT,而不是包含的路径。我认为。Shell 脚本不是我的强项 =o)
0赞 Eli 2/9/2012
@evil奥托:哦,你是说路径是什么?在这个服务器中,它是 /var/www/rmc/pear。转义版本将是 \/var\/www\/rmc\/pear,这应该(希望)导致文件中的占位符替换为未转义的路径。对不起,我读了你最后的评论是为什么,而不是什么。

答:

3赞 yomimono 2/9/2012 #1

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

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

评论

0赞 Eli 2/9/2012
是的,很好。我解决了这个问题,但额外的“$”是杀死它的原因。
2赞 Eli 2/9/2012 #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