1

我有 strftime 格式的时间,比如说(%Y-%m-%d %H:%M:%S)和一个应该包含这种数据的文件,例如(2012-02-11 17:15:00). 我需要检查给定的模式是否真的与数据匹配。如何解决这个问题?啊,约会?

编辑: 更多信息:用户输入 strftime 格式,比如说输入。然后他输入一个应该包含这些日期的文件。我需要确保这些数据是有效的(他没有犯错)。所以我需要检查输入文件中的行,看看是否有与给定模式匹配的数据。例子:

  • 用户输入 strftime 格式:(%Y-%m-%d %H:%M:%S)

    输入文件:(2012-02-11 17:15:00) long sentence

    有效的

  • 用户输入 strftime 格式:Date[%Y.%m.%d %H:%M:%S]

    输入文件:Date-2012.02.11 17:15:00- long sentence

    无效的

4

3 回答 3

1

如果您允许使用外部辅助二进制文件,我已经编写了 dateutils来批处理日期和时间数据。

dconv -q -i '(%Y-%m-%d %H:%M:%S)' <<EOF
not a match: 2012-04-10 12:00:00
a match: (2012-04-10 13:00:00)
EOF

会给

2012-04-10T13:00:00

-i是输入格式,-q禁止警告。并dconv尝试将输入行转换为输出行(在这种情况下,它将匹配行转换为 ISO 标准格式。

因此,使用此方法,如果输入行数等于输出行数,则文件完全匹配。

于 2012-04-10T09:33:23.100 回答
0

If you want to check current datetime:

echo "(2012-02-11 17:15:00)" | grep "$(date "+%Y-%m-%d %H:%M:%S")"

If some other you need GNU date (-d option). This works for me:

echo "(2012-02-11 17:15:00)" | 
grep "$(date -d "2012-02-11 17:15:00"  "+%Y-%m-%d %H:%M:%S")"
于 2012-04-10T09:04:22.873 回答
0

我会对此采取蛮力的方法:用%X相应的正则表达式替换任何说明符,然后您可以过滤掉与生成的正则表达式不匹配的行:

user_format="%Y-%m-%d"
awk -v fmt_string="$user_format" '
  BEGIN {
    gsub(/[][(){}?|*+.]/ "\\&", fmt_string)  # protect any regex-special chars
    gsub(/%Y/, "([0-9]{4})", fmt_string)
    gsub(/%m/, "(0[1-9]|1[012])", fmt_string)
    gsub(/%d/, "(0[1-9]|[12][0-9]|3[01])", fmt_string)
    # and so on
  }
  $0 !~ "^" fmt_string {print "line " NR " does not match: " $0}
' filename
于 2012-04-10T11:05:16.513 回答