Regex Perl内联替换shell脚本未按预期工作

Regex Perl内联替换shell脚本未按预期工作,regex,bash,perl,shell,Regex,Bash,Perl,Shell,我在一个shell脚本中有一个perl内联替换命令,由于某种原因它不起作用。使用下面的命令,它将在perl命令中用替换字符串替换所有“:” 当我手动ssh到box并运行perl命令时,效果与预期一样 ssh host "cd /x/somedirectory && perl -pi -e 's#\${somehost}:\${someport}#10.20.30.40:8443#g' config/app.properties" 编辑1 请注意,$somehost和$somep

我在一个shell脚本中有一个perl内联替换命令,由于某种原因它不起作用。使用下面的命令,它将在perl命令中用替换字符串替换所有“:”

当我手动ssh到box并运行perl命令时,效果与预期一样

ssh host "cd /x/somedirectory && perl -pi -e 's#\${somehost}:\${someport}#10.20.30.40:8443#g' config/app.properties"
编辑1 请注意,
$somehost
$someport
不是shell变量。我在找一个文字替代品


我做错了什么?我尝试使用不同的分隔符,转义
{
}
等,但仍然没有成功。

使用here doc尝试此
ssh
命令并避免所有转义:

ssh -t -t host<<'EOF'
cd /x/somedirectory &&
    perl -i -pe 's#\${somehost}:\${someport}#10.20.30.40:8443#g' config/app.properties
exit
EOF

ssh-t-t host使用here doc尝试此
ssh
命令并避免所有转义:

ssh -t -t host<<'EOF'
cd /x/somedirectory &&
    perl -i -pe 's#\${somehost}:\${someport}#10.20.30.40:8443#g' config/app.properties
exit
EOF

ssh-t-t主机远程机器上的shell将执行另一级别的转义。要在远程计算机上接收序列,您必须发送序列:

ssh host "cd /x/somedirectory && perl -pi -e 
    's#\\\${somehost}:\\\${someport}#10.20.30.40:8443#g' config/app.properties"

远程计算机上的shell将执行另一级别的转义。要在远程计算机上接收序列,您必须发送序列:

ssh host "cd /x/somedirectory && perl -pi -e 
    's#\\\${somehost}:\\\${someport}#10.20.30.40:8443#g' config/app.properties"

若要从字符串创建单引号shell文本,请通过将其替换为
'\'
来转义
'

要从字符串中创建双引号shell文本,请通过在
\
$
前面加上
\
来转义
\


您需要的Perl命令是

s#\${somehost}:\${someport}#10.20.30.40:8443#g
ssh host 'perl -pi -e '\''s#\${somehost}:\${someport}#10.20.30.40:8443#g'\'' config/app.properties'
因此,您需要的远程shell命令是

perl -pi -e 's#\${somehost}:\${someport}#10.20.30.40:8443#g' config/app.properties
因此,您需要的本地shell命令是

s#\${somehost}:\${someport}#10.20.30.40:8443#g
ssh host 'perl -pi -e '\''s#\${somehost}:\${someport}#10.20.30.40:8443#g'\'' config/app.properties'


[已删除
cd/x/somedirectory&&
以保持简单。只需将其重新添加。]

要从字符串创建单引号shell文本,请通过将其替换为
\'
来转义
'

要从字符串中创建双引号shell文本,请通过在
\
$
前面加上
\
来转义
\


您需要的Perl命令是

s#\${somehost}:\${someport}#10.20.30.40:8443#g
ssh host 'perl -pi -e '\''s#\${somehost}:\${someport}#10.20.30.40:8443#g'\'' config/app.properties'
因此,您需要的远程shell命令是

perl -pi -e 's#\${somehost}:\${someport}#10.20.30.40:8443#g' config/app.properties
因此,您需要的本地shell命令是

s#\${somehost}:\${someport}#10.20.30.40:8443#g
ssh host 'perl -pi -e '\''s#\${somehost}:\${someport}#10.20.30.40:8443#g'\'' config/app.properties'


[删除了
cd/x/somedirectory&&
以保持简单。只需将其添加回即可。]

这样,您就可以编写Perl

#!/usr/bin/perl

use Net::OpenSSH;
my $ssh = Net::OpenSSH->new($host);
my $old = quotemeta("${somehost}:${someport}");
$ssh->system('cd', $some_directory, \\'&&',
             'perl', '-pi', '-e',
             "s|$old|10.20.30.40:8443|g",
             'config/app.properties');

所以,您可以编写Perl

#!/usr/bin/perl

use Net::OpenSSH;
my $ssh = Net::OpenSSH->new($host);
my $old = quotemeta("${somehost}:${someport}");
$ssh->system('cd', $some_directory, \\'&&',
             'perl', '-pi', '-e',
             "s|$old|10.20.30.40:8443|g",
             'config/app.properties');


somehost
someport
不能被定义。@HunterMcMillen我明白你的意思了
$somehost
$someport
不是shell变量。我在找一个文字替代品。我正在编辑这个问题,在一个shell脚本中用一行代码来计算逃跑就像训练蚂蚁玩杂耍一样。只需使用Perl完成整个过程。否则,将一行程序中的代码放入一个文件中,并像ssh主机那样运行它“那么就不能定义perl-pi code.pl/x/somedir/config/app.properties
somehost
someport
。@HunterMcMillen我明白你现在的意思了
$somehost
$someport
不是shell变量。我在找一个文字替代品。我正在编辑这个问题,在一个shell脚本中用一行代码来计算逃跑就像训练蚂蚁玩杂耍一样。只需使用Perl完成整个过程。否则,将一行代码放入一个文件中,并像perl-pi code.pl/x/somedir/config/app.properties那样运行它。仍然不走运。您在回答中忘记了
{
}
。我添加了它们,但得到的结果相同result@nilesh您正在尝试替换文本
${somehost}
,或者bash变量的值
$somehost
?@ThisSuitesBlack没有。我正在尝试替换文本。
$somehost
$someport
不是shellvariables@anubhava很抱歉造成混淆,
$somehost
$someport
不是shell变量。我正在寻找文本replacement
perl-pei'foo'
相当于
perl-pe'i'foo
(即在文件
foo
上运行代码
i
),您需要
perl-i-pe'foo'
。此外,您必须在正则表达式中转义
$
,这样它就不意味着行的结束:
perl-i-pe's\\${somehost}:${someport}#10.20.30.40:8443#g'
仍然不走运。您在回答中忘记了
{
}
。我添加了它们,但得到的结果相同result@nilesh您正在尝试替换文本
${somehost}
,或者bash变量的值
$somehost
?@ThisSuitesBlack没有。我正在尝试替换文本。
$somehost
$someport
不是shellvariables@anubhava很抱歉造成混淆,
$somehost
$someport
不是shell变量。我正在寻找文本replacement
perl-pei'foo'
相当于
perl-pe'i'foo
(即在文件
foo
上运行代码
i
),您需要
perl-i-pe'foo'
。此外,您必须在正则表达式中转义
$
,这样它就不意味着行的结束:
perl-i-pe's\\${somehost}:${someport}#10.20.30.40:8443#g'
注意:只有在删除换行符或在换行符之前添加
\
时才有效。注意:只有在删除换行符或在换行符之前添加
\
时才有效。我发布的两个版本都有效。除了每天都这样做之外,我还对它们进行了测试。你是否复制错误(例如,使用了
而不是
)?或者可能您没有使用bash(在两台机器上)作为标记?我尝试了这个
ssh主机“perl-pi-e'\''s{somehost}:\${someport}10.20.30.40:8443{g'''''''''''/x/web/STAGE2MS034/paymentapiplatformserv/config/app properties”
。我得到
bash:-c:第0行:在查找匹配的
'`时出现意外的EOF,这与我的两个解决方案都不匹配。您使用了
,因此您需要对
使用转义机制,但您使用了转义机制