Grepping日期不满足年度模式YYYY-01-01

时间:2014-09-19 08:32:08

标签: regex grep

我需要在元数据文件中匿名化出生日期并编辑月和日字段,例如,我需要将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格式的日期以避免双重备份。

以单一模式grep这些日期的简单(阅读:优雅)方式是什么?

1 个答案:

答案 0 :(得分:1)

好吧,无论内容如何,​​我都可能会支持它,但那是因为我有更多的磁盘空间而不是时间来担心这样的事情: - )

然而,一种方法可能是反过来看待它。计算完整文件中的行数,然后使用-01-01计算仅包含模式的行。

如果它们相同,那么所有日期都是-01-01种类,不需要备份。

请注意,您需要注意每行是否有多个日期,但在这种情况下,您可以使用其他过滤器来获取您感兴趣的数据。

例如,请考虑文件infile

2009-01-01 A very good year
2010-02-01 A moderately good year
2011-01-01 A better year
2012-12-31 Not so good
2013-01-01 Back to normal

您可以检测所需格式行开头的日期并对其进行计数,并将其与完整文件进行比较:

if [[ $(wc -l <infile) -ne $(grep -E '^[0-9]{4}-01-01' infile | wc -l) ]]
then
    echo File needs backing up
fi

另一种可能性是使用01-01选项排除 -v模式:

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