将sed反向引用与bash变量混合

时间:2012-08-27 21:17:23

标签: bash sed escaping

我正在运行旧版本的git,我正在编写一个更新主机名配置的脚本。

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

这是我的最大努力

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

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

有什么想法吗?

修改

"s/\(ec2-user@\)\(.*\)\(:repo\.git\)/\\1$foo\\3/"

没有产生正确的答案,因为foo与1合并,产生错误的后退参考。我无法弄清楚如何逃脱$ foo。

1 个答案:

答案 0 :(得分:0)

您需要隔离$foo变量,这样您就不需要在其周围留出空格来将其名称与其他周围的字符区分开来。尝试

sed -i "s/\(ec2-user@\)\(.*\)\(:repo\.git\)/\\1${foo}\\3/" /var/www/.git/config

如果你想在foo之后只有一个空格,那么使用

sed -i "s/\(ec2-user@\)\(.*\)\(:repo\.git\)/\\1${foo} \\3/" /var/www/.git/config

IHTH