web-dev-qa-db-ja.com

文字列がBashスクリプトの正規表現と一致するかどうかを確認

私のスクリプトが受け取る引数の1つは、yyyymmddという形式の日付です。

入力として有効な日付が得られるかどうかを確認したいです。

これどうやってするの?私は次のような正規表現を使用しようとしています:[0-9]\{\8}

157
Peter Nijem

あなたは言うことができます:

[[ $date =~ ^[0-9]{8}$ ]] && echo "yes"

もっと正確:

[[ $date =~ ^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ ]] && echo "yes"
#           |^^^^^^^^ ^^^^^^ ^^^^^^  ^^^^^^ ^^^^^^^^^^ ^^^^^^ |
#           |   |     ^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^^^ |
#           |   |          |                   |              |
#           |   |           \                  |              |
#           | --year--   --month--           --day--          |
#           |          either 01...09      either 01..09     end of line
# start of line            or 10,11,12         or 10..29
#                                              or 30, 31

つまり、あなたが望むフォーマットにマッチする正規表現をbashで定義することができます。このようにあなたがすることができます:

[[ $date =~ ^regex$ ]] && echo "matched" || echo "did not match"

これはAleks-Daniel Jakimenkoによる ユーザー入力日付形式の検証(bash) による解決策に基づいていることに注意してください。


他のシェルでは grep を使うことができます。シェルがPOSIXに準拠している場合は、

(echo "$date" | grep -Eq  ^regex$) && echo "matched" || echo "did not match"

POSIXに準拠していない fish で、あなたはすることができます

echo "$date" | grep -Eq "^regex\$"; and echo "matched"; or echo "did not match"
243
fedorqui

Bashバージョン3では、 '=〜'演算子を使うことができます。

if [[ "$date" =~ "[0-9]\{8\}" ]]; then
    echo "Valid date"
else
    echo "Invalid date"
fi

参照: http://tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF

注:二重括弧[[]]内のマッチング演算子での引用は、Bashバージョン3.2以降では必要なくなりました。

38
aliasav

文字列が正しい日付であるかどうかをテストするのに良い方法は、dateコマンドを使うことです。

if date -d "${DATE}" >/dev/null 2>&1
then
  # do what you need to do with your date
else
  echo "${DATE} incorrect date" >&2
  exit 1
fi
27
Django Janny

expr matchの代わりに=~を使用します。

expr match "$date" "^[0-9]\{8\}" >/dev/null && echo yes

=~は空の文字列にも一致するため、これは=~を使用するという現在受け入れられている答えよりも優れています。 badvarが定義されていないと仮定すると、[[ "1234" =~ "$badvar" ]]; echo $?は(誤って)0を与えますが、expr match "1234" "$badvar" >/dev/null ; echo $?は正しい結果1を与えます。

>/dev/null 出力値 を一致させない場合はexpr matchを使用する必要があります。一致する文字が見つからなかった場合は0です。 出力値 終了ステータス とは異なることに注意してください。一致が見つかった場合は終了ステータスは0、それ以外の場合は1です。

通常、exprの構文は次のとおりです。

expr match "$string" '$substring'

または

expr "$string" : '$substring'

$substringは正規表現です。

1
Penghe Geng

正規表現の使用が日付の文字シーケンスが正しいかどうかを判断するのに役立つ場合がある場合、日付が有効であるかどうかを判断するのに簡単に使用することはできません。次の例では正規表現を渡しますが、すべて無効な日付です。20180231、20190229、20190431

そのため、日付文字列(datestrと呼びましょう)が正しい形式であるかどうかを検証したい場合は、dateを使用して解析し、dateに正しい形式に変換するよう依頼するのが最善です。両方の文字列が同じ場合は、有効な形式と有効な日付があります。

if [[ "$datestr" == $(date -d "$datestr" "+%Y%m%d" 2>/dev/null) ]]; then
     echo "Valid date"
else
     echo "Invalid date"
fi
0
kvantour