在Shell中,如果在字符串中找不到,则如何插入子字符串

时间:2015-08-19 23:26:00

标签: linux shell diffstat

我希望changes_summary始终采用<x> files changed, <y> insertion(+), <z> deletions(-)格式,其中<x> <y><z>是一些数字,但diffstat错过插入和/或删除部分,如果<y>和/或<z>为零,我试图将其打印为<x> files changed 0 insertion(+), 0 deletions(-),是否有更好或更简单的方法来执行此操作?我想更改 $ changes_summary 变量,以便我可以在以后的部分脚本中使用它。

changes_summary=`diff -ur ./dir1 ./dir2 | diffstat | tail -1`
  if ! echo $changes_summary | grep -q "insertions" && ! echo $changes_summary | grep -q "deletions" ; then
        echo $changes_summary | awk '{print $1 " " $2 " " $3 " " "0 insertion(+)," " " "0 deletions(-)"}'
 elif ! echo $changes_summary | grep -q "insertions" && echo $changes_summary | grep -q "deletions" ; then
       echo $changes_summary | awk '{print $1 " " $2 " " $3 " " "0 insertion(+), "$4 " " $5  }'
elif echo $changes_summary | grep -q "insertions" && ! echo $changes_summary | grep -q "deletions" ; then
       echo $changes_summary | awk '{print $1 " " $2 " " $3 " " $4 " " $5 "0 deletions(-)" }'

网络连接

1 个答案:

答案 0 :(得分:1)

如果没有一些严肃的bash魔法或其他语言,你可能得到的最接近的就是以下内容。

changes_summary=`diff -ur ./dir1 ./dir2 | diffstat -s`
CC=$(echo "$changes_summary" | sed -n 's:\(.*[0-9]\+ .* changed\).*:\1:p')
II=$(echo "$changes_summary" | sed -n 's:.*\([0-9]\+ insertions\?\).*:\1:p')
DD=$(echo "$changes_summary" | sed -n 's:.*\([0-9]\+ deletions\?\).*:\1:p')
echo "${CC}, ${II:-0 insertions}(+), ${DD:-0 deletions}(-)"

Sed删除与每个统计信息对应的消息。 -n抑制正常输出,p仅在找到匹配项时打印。如果没有,那么CC,II,DD将为空,在这种情况下${II:-...}模式替换默认值。

来自man bash

  

${parameter:-word}使用默认值。如果参数未设置或为null,   单词的扩展被替换。否则,值   参数被替换。

请注意,将(s)与s\?保持在一起可能对你来说太过分了。

另一个选项是,在bash中,您可以使用[[ $a =~ "b" ]]检查包含并使用您的原始方法。它至少让你失去了贪婪,如果你删除引号,"b"这里也可以是正则表达式。

if ! [[ "$changes_summary" =~ "insert" ]]; then
  awk ...
fi

您还可以在=~中找到man bash