【问题标题】:bash: sed: unexpected behavior: displays everythingbash:sed:意外行为:显示所有内容
【发布时间】:2015-08-13 19:31:48
【问题描述】:

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

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)。然后进行备份并编辑 perl 模块中从 []['--timeout=35'] 的单行

它看起来像是在 sed replace one liner 上绊倒了。

【问题讨论】:

  • 你的脚本有大量的外部依赖。请尝试将其减少为minimal complete verifiable example。谢谢。
  • 另外,第一个 if 条件过于复杂,猴子补丁系统 Perl 代码似乎非常不准确。
  • if 是不是打算说if [ $version == 6.10 ]; then ...; else ...; fi?我还建议使用grep -q 来测试您的包是否存在(如果没有更合适的方法)。
  • 你确定\x91\x93是你需要的吗?这似乎错过了我的方括号。使用sed -ri'.bkup' 's!\[\]!\[\x27--timeout=35\x27\]!' foo 似乎对我有用...
  • 所以...没有人见过 sed 命令打印出随机垃圾,那我一定是疯了吗?

标签: bash sed


【解决方案1】:

有两个主要问题(cmets 中解决了小问题)。第一个是您对[] 使用十进制 代码而不是十六进制,因此您应该使用\x5b\x5d 而不是\x91\x93。第二个问题是,如果您确实使用了正确的代码,sed 仍会将其在语法上解释为[]。所以你逃不掉的。你应该这样称呼:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-30
    • 2013-04-19
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多