2017-05-04 75 views
3

我需要的bash脚本接受日期格式字符串(“的strftime”格式),例如:检查字符串匹配给定的日期,就像格式

< < [%Y-%间%d%H:%M:%S] >>

然后检查在我的输入文件数据(左值)是否该给定的字符串匹配或不:

格式字符串:< < [%Y-%间 - %d%H:%M:%S] >>
数据文件:
< < [2017年5月4日14点49分18秒] >> 12.1 - 有效
< [2017年5月4日14点49分18秒]> -1421 - 无效
< < [2017年5月4日14点49分18秒] >> 1231231.02 - 无效

的输入文件有很多行,我唯一想到的就是使用Python:

function check_time_format() { 
    python -c "import time; 
time.strptime(\"$1\",\"$2\")" 2> /dev/null 
} 

while read -r lvalue rvalue; do 
    check_time_format "$lvalue" "$TIMEFORMAT" 
    [[ $? != 0 ]] && echo "Invalid format..." 
done < "$file" 

它有效,但它当然非常慢。有没有更好的方法来做到这一点,可能就像容易?

谢谢!

+1

您可以改为使用'date --date = [my_string]'命令来解析时间戳。如果无法解析日期,则返回非零值,否则返回格式化的日期。 – amphetamachine

+1

我需要有可能使用任何字符的字符串,例如:blabla%Y:%Mblabla。你的解决方案无法帮助我实现我的想法。 – PesaThe

回答

0

在我使出结束到我想避免的解决方案。我只是让python处理整个文件而不是bash。

0

我能想到这样做的最简单的方法是使用date解释,然后重新格式化给定格式的日期,然后比较它与原来的输入:

is_in_format() { 
    local fmt="$1" datestring="$2" 
    if [ ! "x$(date "+$fmt" --date="$datestring")" = "x$datestring" ]; then 
     echo "Unrecognized date format: $datestring - use format $fmt" >&2 
     return 2 
    fi 
    return 0 
} 

is_in_format "%F" '2017-06-01' # true 
is_in_format "%F %H:%M" '2017-06-01' # false 
+0

问题是我需要接受像这样的东西:'is_in_format“[[%Y-%m - 这是日期]]''[[2014-10 - 这是日期]]''但日期不接受作为一个有效的日期。 – PesaThe