bash:sed:意外行为:显示所有内容

时间:2015-08-13 10:41:32

标签: bash sed

我写了一些我认为可以在一堆机器上运行的快速脚本。相反,它会在递归搜索中打印看起来像目录内容的内容:

version=$(mysql Varnish -B --skip-column-names -e "SELECT value FROM sys_param WHERE param='PatchLevel'" | sed -n 's/^.*\([0-9]\.[0-9]*\).*$/\1/p')
if [[ $(echo "if($version == 6.10) { print 1; } else { print 0; }" | bc) -eq 1 ]]; then
    status=$(dpkg-query -l | awk '{print $2}' |  grep 'sg-status-polling');
    cons=$(dpkg-query -l | awk '{print $2}' |  grep 'sg-consolidated-poller');
    if [[ "$status" != "" && "$cons" != "" ]]; then
        echo "about to change /var/www/Varnish/lib/Extra/SG/ObjectPoller2.pm"; echo;
        cp /var/www/Varnish/lib/Extra/SG/ObjectPoller2.pm /var/www/Varnish/lib/Extra/SG/ObjectPoller2.pm.bkup;
        sed -ir '184s!\x91\x93!\x91\x27--timeout=35\x27\x93!'  /var/www/Varnish/lib/Extra/SG/ObjectPoller2.pm;
        sed -n 183,185p /var/www/Varnish/lib/Extra/SG/ObjectPoller2.pm; echo;
    else
        echo "packages not found. Assumed to be not applicable";
    fi
else
    echo "This is 4.$version, skipping";
fi

该脚本应该确保Varnish是4.6.10版并且安装了2个自定义.deb软件包(不是通过apt-get)。然后进行备份并在[]['--timeout=35']

的perl模块中编辑一行

看起来它在sed上的绊倒取代了一个衬垫。

1 个答案:

答案 0 :(得分:1)

有两个主要问题(评论中涉及的小问题)。第一个是您使用[]十进制代码而不是六角形,因此您应该使用\x5b\x5d代替\x91\x93。第二个问题是,如果你使用正确的代码,sed仍将在句法上将其解释为[]。所以你无法摆脱逃避。这是你应该叫的:

sed -ri'.bkup' '184s!\[\]![\x27--timeout=35\x27]!' /var/www/Varnish/lib/Extra/SG/ObjectPoller2.pm

这将为您创建备份(但您应该仔细检查)。