Bash での正規表現のマッチング

Fumbani Banda 2023年1月30日
  1. Bash のリマッチ演算子
  2. Bash での数字のマッチ
  3. Bash で文字列の先頭に Regex マッチする
  4. Bash で文字列の末尾を正規表現でマッチさせる
  5. Bash での電子メールのリージェックスマッチ
Bash での正規表現のマッチング

このチュートリアルでは、bash で re-match 演算子を使用した正規表現の一致について説明します。

Bash のリマッチ演算子

=〜演算子は、マッチング演算子として知られています。次の構文を使用します。

[[ string =~ regex ]]

マッチング演算子は、左から右への文字列の正規表現照合を実行します。左側が右側と一致する場合、演算子は 0 を返し、それ以外の場合は 1 を返します。

Bash での数字のマッチ

以下のスクリプトは、変数 $greet の右側に記載されている文字(この場合は数字)が含まれているかどうかを確認します。完全一致がある場合、マッチング演算子は 0 を返し、スクリプトは正しい出力を出力します。

greet="Hello,World!"

if [[ $greet =~ [0-9] ]]; then
    printf "$greet is a number\n"
else
    printf "$greet is not a number\n"
fi

$greet 変数の値には数字以外の文字しか含まれていないため、マッチング演算子は 1 を返し、以下の出力を出力します。

Hello,World! is not a number

ここでは、num とだけ呼ばれる番号を持つ新しい変数をスクリプトに作成します。次に、num 変数に数値のみがあるかどうかを確認し、再一致演算子によって返された値に応じてそれぞれの出力を出力します。

#!/bin/env bash

num="2021"


if [[ $num =~ [0-9] ]]; then
    printf "$num is a number\n"
else
    printf "$num is not a number\n"
fi

変数 num には数字のみがあるため、マッチング演算子は 0 を返し、スクリプトは以下のステートメントを出力します。

2021 is a number

Bash で文字列の先頭に Regex マッチする

以下のスクリプトは、$greet 変数の値が数字で始まっているかどうかを確認します。^は、文字列の先頭の文字と一致するように指定するために使用されます。演算子から返された値に応じて、それぞれの出力を出力します。

#!/bin/env bash

greet="123Hello,World!"


if [[ $greet =~ ^[0-9] ]]; then
    printf "$greet starts with a digit(s).\n"
else
    printf "$greet does not start with a digit(s)\n"
fi

$greet 変数の値は数値で始まるため、演算子は 0 を返し、以下の出力を出力します。

123Hello,World! starts with a digit(s).

以下に示すように、$greet を新しい値に設定してスクリプトを実行しましょう。

#!/bin/env bash

greet="Hello,World!123"

if [[ $greet =~ ^[0-9] ]]; then
    printf "$greet starts with a digit(s).\n"
else
    printf "$greet does not start with a digit(s)\n"
fi

変数 $greet の文字列は数字で始まらないため、bash 演算子は 1 を返します。スクリプトは、以下に示す出力を出力します。

Hello,World!123 does not start with a digit(s)

Bash で文字列の末尾を正規表現でマッチさせる

以下のスクリプトは、$greet 変数の値が数字で終わっているかどうかを確認します。$ は、文字列の最後の文字と一致するように指定するために使用されます。

出力される出力は、マッチング演算子によって返される値によって異なります。

#!/bin/env bash

greet="Hello,World!123"


if [[ $greet =~ [0-9]$ ]]; then
    printf "$greet ends with a digit(s).\n"
else
    printf "$greet does not end with a digit(s)\n"
fi

$greet 変数の文字列値は数字で終わります。再一致演算子は 0 を返し、スクリプトは以下の出力を出力します。

Hello,World!123 ends with a digit(s).

以下のスクリプトに示すように、$greet 変数の値を変更してみましょう。

#!/bin/env bash

greet="123Hello,World!"

if [[ $greet =~ [0-9]$ ]]; then
    printf "$greet ends with a digit(s).\n"
else
    printf "$greet does not end with a digit(s)\n"
fi

変数 $greet の文字列は 1つまたは複数の数字で終わっていないため、再一致演算子は 1 を返し、スクリプトは以下の出力を出力します。

123Hello,World! does not end with a digit(s)

Bash での電子メールのリージェックスマッチ

メールを照合するには、この^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$ 正規表現パターンが一般的に使用されます。

#!/bin/env bash

email="example@delftstack.com"


if [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$ ]]; then
    printf "$email is a valid email.\n"
else
    printf "$email is not a valid email.\n"
fi

以下の出力は、チェックされ、チェックに合格した電子メールを示しています。

example@delftstack.com is a valid email.

以下に示すように、電子メールの最後にある .com を削除して、スクリプトを実行しましょう。

#!/bin/env bash

email="example@delftstack"


if [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$ ]]; then
    printf "$email is a valid email.\n"
else
    printf "$email is not a valid email.\n"
fi

最後の部分である .com がないため、電子メールはテストに失敗します。

example@delftstack is not a valid email.
著者: Fumbani Banda
Fumbani Banda avatar Fumbani Banda avatar

Fumbani is a tech enthusiast. He enjoys writing on Linux and Python as well as contributing to open-source projects.

LinkedIn GitHub

関連記事 - Bash Regex