1. ホーム
  2. regex

[解決済み] Bashスクリプトで文字列が正規表現にマッチするかどうかをチェックする

2022-03-06 03:02:20

質問

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

入力として有効な日付が得られるかどうかをチェックしたい。

どうすればいいのでしょうか?私は次のような正規表現を使おうとしています。 [0-9]\{\8}

どのように解決するのですか?

テストコンストラクトを使用することができます。 [[ ]] 正規表現のマッチ演算子と一緒に使用します。 =~ を使用すると、文字列が正規表現に一致するかどうかを確認することができます。

具体的なケースでは、こう書けばいい。

[[ "$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      |
#      start of line         or 10,11,12         or 10..29      |
#                                                or 30, 31      |
#                                                          end of line

つまり、正規表現を バッシュ は、希望する書式にマッチします。こうすると、できるようになります。

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

の後のコマンドは && の後のコマンドはテストが成功した場合に実行されます。 || は、テストが失敗した場合に実行されます。

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


他のシェルでは グレップ . お使いのシェルが POSIX 準拠の場合は、次のようにします。

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

というのは、POSIXに準拠していないため、次のようになります。

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

注意事項 これらのポータブルな grep ソリューションは 防水ではありません 例えば、入力パラメータに改行が含まれていると騙されることがあります。最初に紹介した bash-specific regex check にはこのような問題はありません。