我希望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(-)" }'
网络连接
答案 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
。