我需要在元数据文件中匿名化出生日期并编辑月和日字段,例如,我需要将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这些日期的简单(阅读:优雅)方式是什么?
答案 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