我必须在一个非常古老的awk脚本上实现一些新功能,现在想要实现一些单元测试来检查我的脚本是否破坏了。我使用diff检查脚本输出是否与whished输出不同:
awk -f mygenerator.awk test.1.gen | diff - test.1.out -q
if [ $? -ne 0 ]; then
echo "test failed"
fi
但现在我有一些文件生成动态内容,如生成日期的时间戳,这会导致diff失败,因为显然时间戳会有所不同。 我的第一个是用grep删除相应的行并测试两个“干净”的文件。然后通过egrep检查该行是否为时间戳。
有没有更好的方法呢?由于兼容性原因,它应该全部由bash脚本中的常见unix工具完成。
答案 0 :(得分:0)
我通常使用sed
将时间戳替换为XXXXXX
,因此我仍然可以比较同一行上的其他信息。
date | \
sed 's/\(Sun\|Mon\|Tue\|Wed\|Thu\|Fri\|Sat\) \(Jan\|Feb\|Mar\|Apr\|May\|Jun\|Jul\|Aug\|Sep\|Oct\|Nov\|Dec\) \?[0-9]\+ [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [A-Z]\+ [0-9]\{4\}/XXXXXX/'
答案 1 :(得分:0)
您可以将sed
与正则表达式一起使用。
如果您的输出与Fri Feb 21 22:53:54 UTC 2014
命令中的date
类似,请使用:
regex_timestamp="s/([A-Z]{1}[a-z]{2} [A-Z]{1}[a-z]{2} [0-9]{2} [0-9]{2}\:[0-9]{2}\:[0-9]{2} [A-Z]{3} [0-9]{4})//g";
awk -f mygenerator.awk test.1.gen | diff <(sed -r "$regex_timestamp" -) <(sed -r "$regex_timestamp" test.1.out) -q
如果您尝试过滤unix时间戳,只需将其用作正则表达式:
s/([0-9]{10})//g
请注意,后者会替换与unix时间戳相同大小的任何数字组。你的时间戳是什么格式?