提问人:Eli 提问时间:2/9/2012 最后编辑:jcolladoEli 更新时间:2/9/2012 访问量:2625
简单的 BASH 字符串更换
Simple BASH string replacement
问:
我正在尝试将配置文件中的实例替换为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/
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
并最终将 in 的所有实例替换为 ?{$pear_root}
test.txt
PEAR_ROOT
我不依附于这种方法 - 任何可靠的方法都可以。
答:
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
评论