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]}
。