在shell脚本中比较文件,但忽略特定的差异

时间:2015-11-03 19:34:17

标签: regex bash shell sed

我有一个shell脚本,可以在两个目录中比较同名文件,并提醒我注意差异。大多数情况下,新批处理中的文件文件不变,但偶尔会有一个更改,我需要采取一些措施。我试图更新我的脚本以忽略我不关心的细微差别,特别是Amazon S3 URL中的Expiration和Signature标记。

我当前的脚本使用cmp来完全比较文件:

if ! cmp --silent ${i} ${COMPARE_DIR}/${i}; then
  echo "$i : TAKE ACTION"
fi

我在命令行上相当快地计算出一种使用sed重新编写有问题的模式的方法:

cmp <(sed -e "s/Expires.*3D/Expires3D/" file1.json) <(sed -e "s/Expires.*3D/Expires3D/" ../other/file1.json)

对于我的生活,我无法弄清楚在我的脚本中使其工作的语法。首先,它抱怨括号,在逃避之后我得到了一个非常有帮助的No such file or directory错误。我没有尝试过改善的事情。

有什么建议吗?有没有更好的方法来达到我想要的目标?

3 个答案:

答案 0 :(得分:1)

假设行cmp <(sed -e "s/Expires.*3D/Expires3D/" file1.json) <(sed -e "s/Expires.*3D/Expires3D/" ../other/file1.json)正常工作,您可以按如下方式检查结果:

cmp <(sed -e "s/Expires.*3D/Expires3D/" file1.json) <(sed -e "s/Expires.*3D/Expires3D/" ../other/file1.json)
if [ "$?" -ne "0" ] ; then
    echo "$i : TAKE ACTION"
fi

答案 1 :(得分:1)

  

首先它抱怨括号,在逃避之后我得到了一个非常有帮助的没有这样的文件或目录错误。

很可能你的脚本是以Bash身份运行的。确保第一行是#!/bin/bash(或者在系统中有Bash的地方)。 这是因为<(...)是特定于Bash的,/bin/sh或其链接的任何内容可能都不受支持。

例如,如果您的脚本的第一行是#!/bin/sh,那么您将收到如下错误:

  

script.sh:第3行:意外令牌附近的语法错误`(&#39;

然后,就像你说的那样,你&#34;转义了括号&#34;,就像<\(sed -e ...\)一样,shell会将其解释为来自文件的输入重定向,并且因为你没有这样做文件(名为&#34;(sed&#34;)的文件,No such file or directory错误完全符合预期。

答案 2 :(得分:0)

如果您的操作可以作为单个命令或函数调用编写,则可以使用<? if($_SESSION["LogedInAdminId"] && $_SESSION['AdminStatus']=="M") { ?> <? if($_SESSION["LogedInAdminId"] && $_SESSION['AdminStatus']=="M" || "A") { ?> 运算符替换&&||以获得非常混乱单行:

if-then