shell脚本中的Perl内联替换不能按预期工作

时间:2015-11-13 16:09:27

标签: regex bash perl shell

我在shell脚本中有一个perl内联替换命令,由于某种原因它没有工作。使用以下命令,它取代所有":"在perl命令中使用替换字符串。

当我手动ssh到框并运行perl命令时,按预期工作。

<div class="header-container">
        <header id="header">
            {capture name='displayBanner'}{hook h='displayBanner'}{/capture}
            {if $smarty.capture.displayBanner}
                <div class="banner">
                    <div class="container">
                        <div class="row">
                            {$smarty.capture.displayBanner}
                        </div>
                    </div>
                </div>
            {/if}
            {capture name='displayNav'}{hook h='displayNav'}{/capture}
            {if $smarty.capture.displayNav}
                <div class="nav">
                    <div class="container">
                        <div class="row">
                            <nav>{$smarty.capture.displayNav}</nav>
                        </div>
                    </div>
                </div>
            {/if}
            <div>
                <div class="container">
                    <div class="row">
                        <div id="header_logo">
                            <a href="{if isset($force_ssl) && $force_ssl}{$base_dir_ssl}{else}{$base_dir}{/if}" title="{$shop_name|escape:'html':'UTF-8'}">
                                <img class="logo img-responsive" src="{$logo_url}" alt="{$shop_name|escape:'html':'UTF-8'}"{if isset($logo_image_width) && $logo_image_width} width="{$logo_image_width}"{/if}{if isset($logo_image_height) && $logo_image_height} height="{$logo_image_height}"{/if}/>
                            </a>
                        </div>
                        {if isset($HOOK_TOP)}{$HOOK_TOP}{/if}

                         /*********************************************
                         HERE I'D LIKE TO DISPLAY THE HOMESLIDER MODULE
                         *********************************************/


                        <!--{if $page_name !='index' && $page_name !='pagenotfound'}
                        {include file="$tpl_dir./modules/homeslider/homeslider.tpl"}
                        {/if} -->
                    </div>
                </div>
            </div>
        </header>
    </div>

EDIT1

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

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

4 个答案:

答案 0 :(得分:3)

要从字符串创建单引号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 &&以简化操作。只需将其添加回来。]

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

所以,你可以写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');

答案 3 :(得分:0)

使用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