さらに重要なのは、これらの正規表現との混同を避けることです。

さらに重要なのは、これらの正規表現との混同を避けることです。

OSXでは、日付形式を検証し、それをエポック時間に変換する関数を構築しています。関数は、日付が次の形式のいずれかであることを確認する必要があります(エラーがない場合)。 01/01/1970 10:00PMまたは10:00PM%m/%d/%Y %I:%M%pまたは%I:%M%p

機能

checkTIME () {
    local CONVERT_CHK_TIME="$1"
    if [[ "$CONVERT_CHK_TIME" =~ ^(0[0-9]|1[0-2]):[0-9][0-9](AM|PM)$ ]]; then
        CONVERT_TIME="$(date -j -f "%I:%M%p" "$CONVERT_CHK_TIME" "+%s")"
    elif [[ "$CONVERT_CHK_TIME" =~ (0[0-9]|1[0-2])\/([0-2][0-9]|3[0-1])\/\d{4}\s[0-9][0-9]:[0-9][0-9](AM|PM) ]]; then
        CONVERT_TIME="$(date -j -f "%m/%d/%Y %I:%M%p" "$CONVERT_CHK_TIME" "+%s")"
    else
        echo "ERROR!"
        exit 1
    fi
}

現在はうまくいきます10:00PMが、試してみると一致しません。01/10/2017 10:00PM

私はそれをそう呼ぶ:

./convert '01/10/2017 10:00PM'
...
...
+ [[ -n 01/10/2017 10:00PM ]]
+ checkTIME '01/10/2017 10:00PM'
+ local 'CONVERT_CHK_TIME=01/10/2017 10:00PM'
+ [[ 01/10/2017 10:00PM =~ ^(0[0-9]|1[0-2]):[0-9][0-9](AM|PM)$ ]]
+ [[ 01/10/2017 10:00PM =~ (0[0-9]|1[0-2])/([0-2][0-9]|3[0-1])/d{4}s[0-9][0-9]:[0-9][0-9](AM|PM) ]]
+ echo 'ERROR!'
ERROR!
+ exit 1

ありがとうございます!

また、次の正規表現を試しました。

(0[0-9]|1[0-2])\/([0-2][0-9]|3[0-1])\/\d{4}\ [0-9][0-9]:[0-9][0-9](AM|PM)

ベストアンサー1

GNUにアクセスできる場合、1つのオプションdateはGNUに重い作業を実行させ、REの複雑さを完全に防ぐことです。

checkTIME () {
    convert_time=$(date --date "$1" +'%s' 2>/dev/null)
    if [[ -z "$convert_time" ]]
    then
        echo 'ERROR!'
        exit 1
    fi
}

GNUにアクセスできず、date検証にRE matchが必要であることを案内したので、この方法を使用してください。 (私はあなたが他のいくつかを提供したことを知っています。)

[[ " $1 " =~ ^' '*([01]?[0-9]/[0123]?[0-9]/2[0-9][0-9][0-9])?' '+([01]?[0-9]:[0-5][0-9][AP]M)?' '*$ ]]

入力パラメータ()の両側に余白を追加して、任意の項目$1と一致させることができます。日付時間または日時(2つのコンポーネントの間には必須のスペースがあります。)作成したとおり、日付部分には2000年代の4桁の年が必要です。この要件を緩和することもできます。

一度は' 'スペースを指定しました。必要に応じて、それを使用して[[:space:]]スペースを表すことができます。

比較後、日付部分をに${BASH_REMATCH[1]}、時間部分をに選択できます${BASH_REMATCH[2]}

おすすめ記事