2017-05-04 7 views
3

私は例えば、日付形式の文字列( "のstrftime" 形式)を受け入れるように私ののbashスクリプトが必要:チェックすると、文字列の一致指定された日付のような形式

< < [%Y-%M- %D%H:%のM:%のS] >>

その後、私の入力ファイル内のデータ(左値)は、この与えられた文字列かと一致するかどうかを確認します。

書式文字列を:< < [%Y-%M-%D%H:%M:%S] >>
データファイル:
< < [2017年5月4日夜2時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

問題は次のようなものを受け入れる必要があります: '[%Y-%m - これは日付です]] '' [[2014-10 - これは日付です]] ''しかし、日付はそれを受け入れません有効な日付。 – PesaThe