不符合年份模式YYYY-01-01的加注日期



我需要匿名化元数据文件中的出生日期,并编辑月份和日期字段,例如,我需要将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

最新更新