Bash 中的正規表示式匹配

Fumbani Banda 2023年1月30日 2022年5月14日
  1. Bash 中的重新匹配運算子
  2. 在 Bash 中匹配數字
  3. 正規表示式匹配 Bash 中字串的開頭
  4. 正規表示式匹配 Bash 中字串的結尾
  5. Bash 中的正規表示式匹配電子郵件
Bash 中的正規表示式匹配

本教程演示了使用 bash 中的重新匹配運算子進行正規表示式匹配。

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 中字串的開頭

下面的指令碼檢查 $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

bash 運算子將返回 1,因為變數 $greet 中的字串不以數字開頭。該指令碼將列印如下所示的輸出。

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,並且指令碼會在下面列印輸出。

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 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