Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
混合sed反向引用和bash变量_Bash_Sed_Escaping - Fatal编程技术网

混合sed反向引用和bash变量

混合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

我正在运行一个旧版本的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/.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/'