![](/img/trans.png)
[英]Shell substitution/replace not working as expected with Perl and SED
[英]Perl inline replace in shell script not working as expected
我在外殼腳本中有一個perl內聯替換命令,由於某種原因該命令無法正常工作。 使用以下命令,在perl命令中用替換字符串替換所有“:”。
當我手動ssh到框並運行perl命令時,按預期方式工作。
ssh host "cd /x/somedirectory && perl -pi -e 's#\${somehost}:\${someport}#10.20.30.40:8443#g' config/app.properties"
請注意, $somehost
和$someport
不是shell變量。 我正在尋找文字替換。
我究竟做錯了什么? 我嘗試使用不同的定界符,轉義{
和}
等,但還是沒有運氣。
要從字符串創建單引號的shell文字,請通過用'\\''
替換'
來轉義'\\''
。
要從字符串創建雙引號的shell文字,請在\\
, "
和$
前面加上\\
轉義。
您想要的Perl命令是
s#\${somehost}:\${someport}#10.20.30.40:8443#g
所以你想要的遠程shell命令是
perl -pi -e 's#\${somehost}:\${someport}#10.20.30.40:8443#g' config/app.properties
所以你想要的本地shell命令是
ssh host 'perl -pi -e '\''s#\${somehost}:\${someport}#10.20.30.40:8443#g'\'' config/app.properties'
要么
ssh host "perl -pi -e 's#\\\${somehost}:\\\${someport}#10.20.30.40:8443#g' config/app.properties"
[刪除了cd /x/somedirectory &&
以簡化操作。 只需重新添加即可。]
遠程計算機上的外殼將執行另一個轉義。 要在遠程計算機上接收序列\\$
,您必須發送序列\\\\\\$
:
ssh host "cd /x/somedirectory && perl -pi -e
's#\\\${somehost}:\\\${someport}#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');
將此ssh
命令與here-doc一起嘗試,並避免所有轉義:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.