簡體   English   中英

Shell腳本中的Perl內聯替換無法按預期工作

[英]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"

編輯1

請注意, $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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM