混合sed反向引用和bash变量
我正在运行一个旧版本的git,我正在编写一个脚本来更新主机名配置 我的问题是我不能找出正确的转义字符组合,这样变量就不会与正则表达式中使用的back引用混合 这是我最大的努力混合sed反向引用和bash变量,bash,sed,escaping,Bash,Sed,Escaping,我正在运行一个旧版本的git,我正在编写一个脚本来更新主机名配置 我的问题是我不能找出正确的转义字符组合,这样变量就不会与正则表达式中使用的back引用混合 这是我最大的努力 #!/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/.gi
#!/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
这将在第一个back引用和变量foo之间放置一个空格。希望在第一个back引用和$foo之间不要有这样的空间。我想我可以用文字来代替反向引用,但是用户名和回购协议可能会改变
有什么想法吗
编辑
"s/\(ec2-user@\)\(.*\)\(:repo\.git\)/\\1$foo\\3/"
不生成正确答案,因为foo与1合并,生成错误的back引用。我不知道如何对$foo进行转义。您需要隔离
$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你确定问题是你认为的那样吗?因为
sed
后面紧跟着其他文本(甚至包括数字)的反向引用应该没有问题。例如,echo abc | sed's/\(a\)/\12/'
打印a2bc
。这是因为,根据POSIX规范,sed
最多只支持九个子表达式,通过\9
称为\1
“s/(ec2 user@)(.*)(:repo\.git)/\\1$foo\\3/”不会生成正确的答案。那么,它会生成什么呢?而sed--version打印的是什么呢?作为记录,反模式grepx|awk'{stuff}
通常可以重构为awk'/x/{stuff}
对sed命令使用单引号,即's/\(ec2 user@\\)(.\)\(:repo\.git\/\1'$foo''\3/'