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.