我不得不在一个非常旧的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 工具完成。
您可以将sed
与正则表达式一起使用。
如果输出类似于 date
命令中的Fri Feb 21 22:53:54 UTC 2014
,请使用:
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 时间戳大小相同的任何一组数字。您的时间戳是什么格式?
我通常使用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/'