2012-08-27 112 views
1

我正在运行旧版本的git,并且正在编写更新主机名称配置的脚本。将bd变量与bash变量混合使用

我的问题是,我无法弄清楚正确的转义字符组合,以便一个变量不与我的正则表达式中使用的反向引用混合。

这是我最大的努力

#!/bin/bash 
#code 
foo=`ec2-describe-instances i-f95e4b82 | grep amazon | awk '{print $4}'` 
sed -i "s/\([email protected]\)\(.*\)\(:repo\.git\)/\\1 $foo \\3/" /var/www/.git/config 

这使得第一反向引用和变量foo的之间的空间。希望在第一个引用和$ foo之间没有这个空格。我怀疑我可以使用文字而不是反向引用,但用户名和回购可能会改变。

任何想法?

编辑

"s/\([email protected]\)\(.*\)\(:repo\.git\)/\\1$foo\\3/" 

因为foo是使用混合了与1,产生错误的反向引用不会产生正确的答案。我无法弄清楚如何逃脱$ foo。

+1

你确定是什么问题,你认为它是什么?因为'sed'应该没有任何问题,即使在其他文本之后立即引用后面的引用,甚至包括数字。例如,'echo abc | sed's/\(a \)/ \ 12 /''打印'a2bc'。这是因为,根据POSIX规范,“sed”最多只支持9个子表达式,通过'\ 9'指向'\ 1'。 – ruakh

+0

“s/\(ec2-user @ \)\(。* \)\(:repo \ .git \)/ \\ 1 $ foo \\ 3 /”不会产生正确答案 – Mikhail

+2

那么,它是什么生产呢?什么'sed --version'打印? – ruakh

回答

0

您需要隔离$foo变量,因此您不需要周围的空间来从其他周围角色名称中选择名称。尝试

sed -i "s/\([email protected]\)\(.*\)\(:repo\.git\)/\\1${foo}\\3/" /var/www/.git/config 

如果你只想富后面输入一个空格,然后使用

sed -i "s/\([email protected]\)\(.*\)\(:repo\.git\)/\\1${foo} \\3/" /var/www/.git/config 

IHTH