我需要匿名化元数据文件中的出生日期,并编辑月份和日期字段,例如,我需要将1976-05-25
转换为1976-01-01
。出于备份目的,我首先需要测试文件是否包含未经编辑的出生日期。我通常使用grep进行这些测试,比如这个
if grep -E PATTERN $file > /dev/null; then cp $file /backups/; fi
然而,我很难为这项任务找到一个漂亮优雅的模式。我试过
grep -E '([12][09][0-9][0-9])-(^(01))-(^(01))'
但是它不接受例如2001-10-11
或任何其他日期。
我当然也可以做一些类似的事情
([12][09][0-9][0-9]-0[0-9]-0[^1]|[12][09][0-9][0-9]-0[0-9]-1[0-9]|...)
但这太复杂,而且容易出错。
当然,我不希望它接受YYYY-01-01
格式的日期,以避免双重备份。
用一种简单(读作:优雅)的方式把这些日期做成一个单一的图案是什么?
好吧,不管内容如何,我可能都会备份它,但这是因为我有更多的磁盘空间而不是时间来担心这样的事情:-)
然而,一种方法可以是反过来看。计算完整文件中的行数,然后计算仅包含-01-01
模式的行数。
如果它们相同,那么所有日期都是-01-01
类型的,不需要备份。
请注意,您需要注意每行是否有多个日期,但在这种情况下,您可以使用其他过滤器来获取您感兴趣的数据。
例如,考虑文件infile
:
2009-01-01非常好的一年2010-02-01年中向好2011-01-01美好的一年2012-12-31不太好2013-01-01恢复正常
您可以在所需格式的行的开头检测日期,并对其进行计数,将其与完整文件进行比较:
if [[ $(wc -l <infile) -ne $(grep -E '^[0-9]{4}-01-01' infile | wc -l) ]]
then
echo File needs backing up
fi
另一种可能性是使用-v
选项排除01-01
模式:
pax> grep -Ev '[0-9]{4}-01-01' infile
2010-02-01 A moderately good year
2012-12-31 Not so good
这相对容易从if
语句中检测到:
if [[ ! -z "$(grep -Ev '^[0-9]{4}-01-01' infile)" ]] ; then
echo File needs backing up
fi